下面的代码需要spring环境的支持;
看这个系列博客之前,需要这个博客,大概了解下 spring secutity 文档
配置springSecurityFilterChain过滤器
-
第一步
写一个类,继承
WebSecurityConfigurerAdapter
类,并且实现WebMvcConfigurer
接口;package cn.hyc.config; import org.springframework.context.annotation.Bean; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** * 跟 springSecurityFilterChain 有关的 过滤器 */ @EnableWebSecurity public class WebSecurityConfig implements WebMvcConfigurer { /** * 配置认证用户信息,有好多种方法,这里只是最简单一种,写死在代码里面 * @return */ @Bean public UserDetailsService userDetailsService() { InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager(); manager.createUser(User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build()); return manager; } }
-
第二步
然后再写一个类 ,继承
AbstractSecurityWebApplicationInitializer
类package cn.hyc.config; import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; /** * * * 配置 springSecurityFilterChain 拦截器,拦截所有的请求 */ public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { }
以上两步,就完成了
springSecurityFilterChain
拦截器的注册,这个拦截器的名字,如果用配置文件配置,名字是不可以变的,这里用官网的教程,直接写上面的两个类,就可以完成springSecurityFilterChain
的注册;
配置身份验证
在之前的第一步的 WebSecurityConfig
类里面,我们配置了一个用户身份信息,现在,我们需要告诉 Spring Security
都对哪些 URL
进行校验;
我们让我们写的 WebSecurityConfig
类,再继承 WebSecurityConfigurerAdapter
类,覆写 configure(HttpSecurity http)
方法,在里面进行配置 URL
;
package cn.hyc.config;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 跟 springSecurityFilterChain 有关的 过滤器
*/
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter implements WebMvcConfigurer {
/**
* 认证用户信息
* @return
*/
@Bean
public UserDetailsService userDetailsService() {
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build());
return manager;
}
/**
* 对 哪些 URL 进行身份验证
* @param http
* @throws Exception
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.logout()
.logoutUrl("/logout")
.and()
.httpBasic();
}
}
加载配置
我们的 WebSecurityConfig
类,就是一个配置类,我们需要将它加载到容器里面,使用下面的类,去完成加载;
package cn.hyc.config;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
/**
* 确保 WebSecurityConfig.class 得到加载
*/
public class MvcWebApplicationInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
// 这里,写上配置类的名字
return new Class[] { WebSecurityConfig.class };
}
@Nullable
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[0];
}
@Override
protected String[] getServletMappings() {
return new String[0];
}
// ... other overrides ...
}
登陆项目
这时候启动项目,可以看到下面的界面,并且我们访问任何 URL
,都会被拦截,然后重定向到这里,因为我们没有通过身份验证:
因为我们自己没有写页面,也没做任何控制层的处理,直接访问,spring Security
会自动的生成一个登陆页面,并且会帮我们进行用户名、密码的校验;
身份验证成功以后,spring security
会调到我们自己没验证的时候,想要访问的页面;
这里我们是基于内存用户登陆的,因为前面的配置类里面,配置的就是在内存中用户,暂时不涉及到 JDBC
操作 ;
退出
在spring security
中,默认访问 /logout
即代表你要退出:
,然后默认的重定向到 /login?logout
当然上面这些,我们也可以在在配置里面,进行自定义,怎么配置,在 大概了解下 spring secutity 文档 里面都有讲,不再累述;