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

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
配置的背后原理:
DefaultSecurityFilterChain
是 HttpSecurity
配置的结果,而 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
会确保这些过滤器按正确的顺序排列,并且为每个请求选择合适的过滤器链。
DefaultSecurityFilterChain
的自定义
6、你可以根据具体的需求定制自己的 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

输出如下:
- DisableEncodeUrlFilter
- WebAsyncManagerIntegrationFilter
- SecurityContextHolderFilter
- HeaderWriterFilter
- CsrfFilter
- LogoutFilter
- UsernamePasswordAuthenticationFilter
- DefaultLoginPageGeneratingFilter
- DefaultLogoutPageGeneratingFilter
- BasicAuthenticationFilter
- RequestCacheAwareFilter
- SecurityContextHolderAwareRequestFilter
- AnonymousAuthenticationFilter
- ExceptionTranslationFilter
- AuthorizationFilter
在 SpringSecurity 6.3.x
版本中,默认过滤器有 15个
总结
DefaultSecurityFilterChain
是 Spring Security 6.x 版本中的核心配置类,负责配置 HTTP 请求的安全性。- 它将所有的安全配置、过滤器、请求匹配等结合在一起,提供了一种灵活的、安全的过滤器链管理机制。
SecurityFilterChain
接口取代了旧版中的HttpSecurity
配置,允许开发者精细控制过滤器的顺序和应用的路径模式。- 你可以通过配置
HttpSecurity
来创建自定义的过滤器链,并对每个请求进行认证、授权、安全处理。 - 打印默认过滤器集合