项目场景
使用 SpringBoot 版本:2.7.1
集成 Spring-Security
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
首先我们对比一下不同版本 WebSecurityConfigurerAdapter
的注释:
SpringBoot 2.3.12.RELEASE
中spring-security-config-5.3.9.RELEASE
SpringBoot 2.7.1
中spring-security-config-5.7.2
Spring 在标注一个类是过时类的时候,同时也给出了新的建议配置方式(上面红框框起来的地方):- 使用
SecurityFilterChain
Bean 来配置HttpSecurity
- 使用
WebSecurityCustomizer
Bean 来配置WebSecurity
这种方式显然更加清晰了,不需要再依赖于一个抽象类提供的通用功能。
配置 HttpSecurity
从 官方文档提供的 SpringSecurity 架构 中可以知道,Servlet
环境中的 Spring Security
是基于 Servlet Filters
实现的,其中的 FileterChainProxy
由 SecurityFilterChain
提供了一系列的 Filter
,架构图如下:
自定义 Filters
配置:
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
httpSecurity.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.disable()
.csrf()
.disable();
return httpSecurity.build();
}
}
配置 WebSecurity
新版本通过配置 WebSecurityCustomizer
Bean 来配置 WebSecurity
,通过源码,我们可以看到 WebSecurityCustomizer
是一个 consumer
类型的 函数式接口:
- WebSecurityCustomizer
@FunctionalInterface
public interface WebSecurityCustomizer {
/**
* Performs the customizations on {@link WebSecurity}.
* @param web the instance of {@link WebSecurity} to apply to customizations to
*/
void customize(WebSecurity web);
}
旧的配置为:
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/login");
}
}
新的配置为:
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
return web -> web.ignoring().antMatchers("/login");
}
}
希望大家拥抱变化,升级是为了更好的提供服务,代码的质量把控也是一个渐进过程。毕竟升级也是为了更完美、更清晰的架构