新方案:SpringSecurity中WebSecurityConfigurerAdapter 类已过时

示例项目使用 SpringBoot 版本:2.7,集成 Spring-Security,添加如下依赖项:

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-security</artifactId>
</dependency>



一、WebSecurityConfigurerAdapter 类已经过时

Spring 在标注一个类是过时类的时候,同时也给出了新的建议配置方式,如图所示:


使用
org.springframework.security.web.SecurityFilterChain Bean来配置HttpSecurity,或者使用WebSecurityCustomizer Bean来配置WebSecurity。


这种方式显然更加清晰了,不需要再依赖于一个抽象类提供的通用功能。


二、配置 HttpSecurity

在Spring Security 5.4中,我们介绍了通过创建SecurityFilterChain bean来配置HttpSecurity的能力。

HttpSecurity是用来构建包含了一系列过滤器链的过滤器SecurityFilterChain,平常我们的配置就是围绕构建SecurityFilterChain进行。构建好的还要交给FilterChainProxy来代理。

下面是一个使用
WebSecurityConfigurerAdapter的配置示例,它使用HTTP Basic保护所有端点。

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

 @Override
 protected void configure(HttpSecurity http) throws Exception {
 http
 .authorizeHttpRequests((authz) -> authz
 .anyRequest().authenticated()
 )
 .httpBasic(withDefaults());
 }
}


接下来,推荐的方法是注入一个SecurityFilterChain bean对象:

@Configuration
public class SecurityConfiguration {

 @Bean
 public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
 http
 .authorizeHttpRequests((authz) -> authz
 .anyRequest().authenticated()
 )
 .httpBasic(withDefaults());
 return http.build();
 }
}


Spring Security 的底层实际上就是一堆过滤器,所以我们之前在 configure(HttpSecurity) 方法中的配置,实际上就是配置过滤器链。现在过滤器链的配置,我们通过提供一个 SecurityFilterChain Bean 来配置过滤器链。

SecurityFilterChain 是一个接口,这个接口只有一个实现类
DefaultSecurityFilterChain。


三、配置 WebSecurity

WebSecurityCustomizer是一个可用于自定义WebSecurity的函数接口。它的作用是来定义哪些请求忽略安全控制,哪些请求必须安全控制。

下面是一个使用
WebSecurityConfigurerAdapter 类的配置示例,用来忽略匹配/ignore1和/ignore2 的请求。

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

 @Override
 public void configure(WebSecurity web) {
 web.ignoring().antMatchers("/ignore1", "/ignore2");
 }
}


接下来,推荐的方法是注入一个WebSecurityCustomizer bean对象:

@Configuration
public class SecurityConfiguration {

 @Bean
 public WebSecurityCustomizer webSecurityCustomizer() {
 return (web) -> web.ignoring().antMatchers("/ignore1", "/ignore2");
 }
}

原文链接:,转发请注明来源!