Spring Security 启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
编写 SpringSecurityConfig 安全配置类
SpringSecurityConfig 安全控制配置类作为安全控制中心, 用于实现身份认证与授权配置功能:
- SpringSecurityConfig必须继承抽象类WebSecurityConfigurerAdapter
- 类上添加注解==@Configuration==(标识为配置类),和==@EnableWebSecurity==(启动SpringSecurity过滤器链功能)
- 一般重写以下两个方法:
- **configure(AuthenticationManagerBuilder auth)**身份认证管理器
- 认证信息提供方式
- 储存方式(内存、数据库)
- **configure(HttpSecurity http)**资源权限配置(过滤链)
- 拦截资源
- 角色权限
- 认证方式:httpBasic、httpForm
- 定制登陆页面、登陆请求地址、错误处理方式
- 自定义SpringSecurity过滤器链等
- **configure(AuthenticationManagerBuilder auth)**身份认证管理器
基于内存存储认证
@Bean
public PasswordEncoder passwordEncoder() {
// 明文+随机盐值加密存储
return new BCryptPasswordEncoder();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// 数据库存储的密码必须是加密后的,不然会报错:There is no PasswordEncoder mapped for the id "null"
String password = passwordEncoder().encode("123456");
logger.info("加密之后存储的密码:" + password);
auth.inMemoryAuthentication().withUser("user1")
.password(password).authorities("ADMIN");
}
HttpForm表单认证
@Override
protected void configure(HttpSecurity http) throws Exception {
// 表单登录方式
http.formLogin()
// 登陆页面地址
.loginPage("/login/page")
// 表单提交地址
.loginProcessingUrl("/login/form")
// 用户名属性名称
.usernameParameter("username")
// 密码属性名称
.passwordParameter("password")
.and()
.authorizeRequests() // 认证请求
//登陆页面放行
.antMatchers("/login/page").permitAll()
//所有访问该应用的http请求都要通过身份认证才可以访问
.anyRequest().authenticated()
; // 注意不要少了分号
}
静态资源放行
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers("/dist/**", "/modules/**", "/plugins/**");
}
SpringSecurity底层认证流程
SpringSecurity采用过滤器链实现认证与授权
请求过滤器链:
-
UsernamePasswordAuthenticationFilter:请求中包括用户和密码则进行认证,认证成功标记认证成功,否则进行下一个认证过滤器。
-
BasicAuthenticationFilter:请求头有basic开头的信息,base64解密后认证,认证成功标记认证成功,否则进入下一认证过滤器。
-
其他认证过滤器
ExceptionTranslationFilter:捕获异常处理后续处理。
FilterSecurityInterceptor:认证通过后,根据资源权限配置来判断当前请求是否可以访问对应资源