SpringSecurity - WebSecurityConfigurerAdapter 过时问题

项目场景

使用 SpringBoot 版本:2.7.1 集成 Spring-Security

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

首先我们对比一下不同版本 WebSecurityConfigurerAdapter 的注释:

  • SpringBoot 2.3.12.RELEASEspring-security-config-5.3.9.RELEASE
    SpringSecurity - WebSecurityConfigurerAdapter 过时问题_第1张图片
  • SpringBoot 2.7.1spring-security-config-5.7.2
    SpringSecurity - WebSecurityConfigurerAdapter 过时问题_第2张图片
    Spring 在标注一个类是过时类的时候,同时也给出了新的建议配置方式(上面红框框起来的地方):
  • 使用 SecurityFilterChain Bean 来配置 HttpSecurity
  • 使用 WebSecurityCustomizer Bean 来配置 WebSecurity

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


配置 HttpSecurity

从 官方文档提供的 SpringSecurity 架构 中可以知道,Servlet 环境中的 Spring Security 是基于 Servlet Filters 实现的,其中的 FileterChainProxySecurityFilterChain 提供了一系列的 Filter,架构图如下:

SpringSecurity - WebSecurityConfigurerAdapter 过时问题_第3张图片

自定义 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");
    }
}

希望大家拥抱变化,升级是为了更好的提供服务,代码的质量把控也是一个渐进过程。毕竟升级也是为了更完美、更清晰的架构

你可能感兴趣的:(#,SpringSecurity,学习,SpringSecurity)