Spring Security 中的 SecurityFilterChain
深度解析
在 Spring Security 6 中,SecurityFilterChain
已成为安全配置的核心接口,彻底取代了传统的 WebSecurityConfigurerAdapter
继承方式。以下是其核心功能、配置方法及与旧版本的差异对比:
一、SecurityFilterChain
的核心角色
-
安全规则容器
- 定义 HTTP 请求的授权规则(如路径权限、方法权限)、认证方式(表单登录、OAuth2)及安全过滤器链。
- 每个
SecurityFilterChain
Bean 对应一组独立的安全配置,支持多条链共存(通过order
属性排序)。
-
请求处理流程
- Spring Security 按
SecurityFilterChain
的顺序逐条匹配请求,第一个匹配的链将处理该请求。 - 示例:公开 API 与管理后台可通过不同链配置独立权限。
- Spring Security 按
二、配置方式对比:6.x vs 5.x
特性 | Spring Security 5.x | Spring Security 6.x |
---|---|---|
配置入口 | 继承 WebSecurityConfigurerAdapter | 定义 SecurityFilterChain Bean |
路径匹配 | antMatchers("/public/**").permitAll() | requestMatchers("/public/**").permitAll() |
方法级权限 | 不支持 | 支持 requestMatchers(HttpMethod.POST, ...) |
过滤器链控制 | 通过 configure(HttpSecurity http) 配置 | 通过 SecurityFilterChain Bean 显式配置 |
三、6.x 配置示例详解
@Configuration
public class SecurityConfig {
// 定义第一条安全链(公开接口)
@Bean
@Order(1)
public SecurityFilterChain publicFilterChain(HttpSecurity http) throws Exception {
http
.securityMatcher("/public/**") // 仅匹配 /public/** 路径
.authorizeHttpRequests(auth -> auth
.anyRequest().permitAll()
)
.csrf(CsrfConfigurer::disable); // 禁用CSRF(根据场景决定)
return http.build();
}
// 定义第二条安全链(管理后台)
@Bean
@Order(2)
public SecurityFilterChain adminFilterChain(HttpSecurity http) throws Exception {
http
.securityMatcher("/admin/**")
.authorizeHttpRequests(auth -> auth
.requestMatchers("/admin/login").permitAll()
.anyRequest().hasRole("ADMIN")
)
.formLogin(form -> form
.loginPage("/admin/login")
.defaultSuccessUrl("/admin/dashboard")
);
return http.build();
}
// 全局安全配置(如JWT、OAuth2)
@Bean
public SecurityFilterChain globalFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/**").authenticated()
)
.oauth2Login(oauth -> oauth
.loginPage("/oauth2/login")
);
return http.build();
}
}
四、关键配置方法解析
-
路径匹配
securityMatcher("/api/**")
: 精确匹配路径(Spring Security 6.2+ 新增,替代antMatcher
)。requestMatchers(HttpMethod.POST, "/api/data")
: 结合 HTTP 方法限制。
-
授权策略
anyRequest().authenticated()
: 所有请求需认证。hasRole("ADMIN")
: 需具备 ADMIN 角色。hasAuthority("SCOPE_read")
: 需拥有特定权限(适用于 OAuth2)。
-
认证方式
formLogin()
: 表单登录配置。oauth2Login()
: OAuth2 客户端配置。httpBasic()
: Basic 认证。
-
安全头配置
headers(headers -> headers.frameOptions().disable())
: 允许 iframe 嵌入(需谨慎)。
五、迁移指南:5.x → 6.x
-
移除
@EnableWebSecurity
- 6.x 默认启用 Web 安全,无需显式注解。
-
替换配置类
// 5.x 配置 @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().anyRequest().authenticated(); } } // 6.x 配置 @Configuration public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(auth -> auth.anyRequest().authenticated()); return http.build(); } }
-
调整路径匹配语法
- 将
antMatchers()
替换为requestMatchers()
,并支持正则表达式:.requestMatchers(regexMatcher("/api/[0-9]+/data"))
- 将
六、高级场景应用
-
多过滤器链协同
- 通过
@Order
注解控制链的优先级,实现微服务网关的细粒度控制。
- 通过
-
与 OAuth2 集成
http.oauth2ResourceServer(oauth2 -> oauth2 .jwt(jwt -> jwt.decoder(jwtDecoder())) );
-
动态权限控制
- 结合
@PreAuthorize
注解和SecurityFilterChain
实现方法级权限:@PreAuthorize("hasAuthority('SCOPE_write')") @PostMapping("/api/data") public ResponseEntity<?> createData() { ... }
- 结合
七、总结
SecurityFilterChain
通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了 Spring Security 的配置范式。其设计哲学与 Spring Boot 的“约定优于配置”理念一脉相承,使安全规则更直观、易维护。对于升级项目,需重点关注路径匹配语法调整、多链优先级控制,并充分利用 Lambda DSL 提升配置可读性。