跳至主要內容

DefaultSecurityFilterChain

Jin大约 4 分钟

DefaultSecurityFilterChain

DefaultSecurityFilterChain 是一个核心类,用于定义和管理一系列的 过滤器链。它替代了以前版本中的 HttpSecurity 配置方式,使得 Spring Security 的配置更加模块化和灵活。DefaultSecurityFilterChain 允许我们为不同的 URL 路径指定不同的安全过滤器,进而控制访问权限、认证和授权逻辑。

源码路径

org.springframework.security.web.DefaultSecurityFilterChain

结构

![image-20241119164213609](images/05-DefaultSecurityFilterChain 入门/image-20241119164213609.png)

1、 概述

DefaultSecurityFilterChain 代表了一个 安全过滤器链,它包含了一系列用于保护应用程序的过滤器。通过这个链,Spring Security 可以处理 HTTP 请求,进行认证、授权、跨站请求伪造 (CSRF) 防护等。

Spring Security 的主要工作是根据不同的请求 URL 路径、HTTP 方法等配置来匹配对应的过滤器链。DefaultSecurityFilterChain 提供了更精细的控制,支持自定义过滤器的顺序、类型以及应用的范围。

2、构建

Spring Security 6.x 版本中,DefaultSecurityFilterChain 通过 SecurityFilterChain 接口来定义。SecurityFilterChain 定义了与某个特定请求模式(如 URL 路径模式、HTTP 方法)匹配的过滤器链。这个接口通常是由开发者在 @Configuration 类中配置的。

配置示例

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeRequests(authorizeRequests ->
                authorizeRequests
                    .antMatchers("/public/**").permitAll()   // 对 /public/** 路径开放访问
                    .anyRequest().authenticated()            // 其他请求需要认证
            )
            .formLogin(Customizer.withDefaults())  // 启用表单登录
            .httpBasic(Customizer.withDefaults()); // 启用 HTTP Basic 认证
        return http.build(); // 返回一个 SecurityFilterChain 实例
    }
}

3、工作原理

当调用 http.build() 时,Spring Security 会生成一个 DefaultSecurityFilterChain 实例。这个实例包含了以下内容:

  • 过滤器链:由多个安全过滤器组成,例如认证过滤器、授权过滤器、CSRF 防护过滤器等。
  • 请求匹配规则antMatchers 或其他 URL 匹配规则,用于确定哪些请求应该被哪些过滤器处理。
  • 配置:一些基本的安全配置,如启用表单登录、HTTP Basic 登录等。

HttpSecurity 配置的背后原理:

DefaultSecurityFilterChainHttpSecurity 配置的结果,而 HttpSecurity 配置通常会转换为 SecurityFilterChain(即 DefaultSecurityFilterChain)实例,之后会根据 SecurityFilterChain 配置的 URL 模式匹配请求,并应用相应的过滤器。

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .anyRequest().authenticated()
        .and()
        .formLogin()
            .loginPage("/login")
            .permitAll()
        .and()
        .logout()
            .permitAll();
    return http.build();
}

在上面的代码中,http.build() 会创建一个 SecurityFilterChain,并且把所有的安全设置转换为一个 DefaultSecurityFilterChain,它会包含相应的认证过滤器、授权过滤器和登录、登出配置。

4、核心构成

Filter List:一个 List<Filter>,其中包含了所有的 Spring Security 过滤器(如 UsernamePasswordAuthenticationFilter, BasicAuthenticationFilter, CsrfFilter 等)。

Request Matcher:一个 RequestMatcher,用于匹配请求的 URL(如 antMatchers("/admin/**"))。每个过滤器链会基于这个匹配器来确定哪个请求会被拦截。

SecurityContext:管理当前请求的安全上下文,通常包含当前用户的认证信息

5、过滤器的顺序与作用

在 Spring Security 中,过滤器是按顺序执行的,不同的过滤器承担不同的职责:

  • SecurityContextPersistenceFilter:在请求开始时,从 HttpSession 加载用户信息,确保每个请求都有对应的用户安全上下文。
  • UsernamePasswordAuthenticationFilter:处理表单登录请求。
  • BasicAuthenticationFilter:处理 HTTP Basic 认证请求。
  • CsrfFilter:保护应用程序免受跨站请求伪造攻击。
  • ExceptionTranslationFilter:处理认证和授权的异常。
  • FilterSecurityInterceptor:最终进行访问控制和授权。

这些过滤器会按照一定的顺序执行,DefaultSecurityFilterChain 会确保这些过滤器按正确的顺序排列,并且为每个请求选择合适的过滤器链。

6、DefaultSecurityFilterChain 的自定义

你可以根据具体的需求定制自己的 DefaultSecurityFilterChain,例如调整过滤器顺序、添加自定义过滤器等。

例如,添加一个自定义过滤器:

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .addFilterBefore(new CustomFilter(), UsernamePasswordAuthenticationFilter.class) // 在 UsernamePasswordAuthenticationFilter 前添加自定义过滤器
        .authorizeRequests()
            .anyRequest().authenticated()
        .and()
        .formLogin().permitAll();
    return http.build();
}

7、打印默认过滤器

启动时在源码中debug,查看所有filter

![image-20241119162612303](images/05-DefaultSecurityFilterChain 入门/image-20241119162612303.png)

输出如下:

  1. DisableEncodeUrlFilter
  2. WebAsyncManagerIntegrationFilter
  3. SecurityContextHolderFilter
  4. HeaderWriterFilter
  5. CsrfFilter
  6. LogoutFilter
  7. UsernamePasswordAuthenticationFilter
  8. DefaultLoginPageGeneratingFilter
  9. DefaultLogoutPageGeneratingFilter
  10. BasicAuthenticationFilter
  11. RequestCacheAwareFilter
  12. SecurityContextHolderAwareRequestFilter
  13. AnonymousAuthenticationFilter
  14. ExceptionTranslationFilter
  15. AuthorizationFilter

SpringSecurity 6.3.x 版本中,默认过滤器有 15个

总结

  • DefaultSecurityFilterChain 是 Spring Security 6.x 版本中的核心配置类,负责配置 HTTP 请求的安全性。
  • 它将所有的安全配置、过滤器、请求匹配等结合在一起,提供了一种灵活的、安全的过滤器链管理机制。
  • SecurityFilterChain 接口取代了旧版中的 HttpSecurity 配置,允许开发者精细控制过滤器的顺序和应用的路径模式。
  • 你可以通过配置 HttpSecurity 来创建自定义的过滤器链,并对每个请求进行认证、授权、安全处理。
  • 打印默认过滤器集合
贡献者: Jin