为什么需要多 SecurityFilterChain



一个应用可能有多种安全需求:
- Web 管理后台需要表单登录,权限基于角色
- REST API 需要 JWT Token 认证,无状态
- 公开的前端页面不需要认证
- 内部监控接口需要 IP 白名单
单一的安全配置无法同时满足这些需求,需要多个 SecurityFilterChain。
配置多个 SecurityFilterChain
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| @Configuration @EnableWebSecurity public class MultiSecurityConfig {
@Bean public SecurityFilterChain webSecurityFilterChain(HttpSecurity http) throws Exception { http .securityMatcher("/web/**") .authorizeRequests() .requestMatchers("/web/admin/**").hasRole("ADMIN") .anyRequest().authenticated() .and() .formLogin() .loginPage("/web/login") .permitAll(); return http.build(); }
@Bean public SecurityFilterChain apiSecurityFilterChain(HttpSecurity http) throws Exception { http .securityMatcher("/api/**") .authorizeRequests() .requestMatchers("/api/public/**").permitAll() .requestMatchers("/api/admin/**").hasRole("ADMIN") .anyRequest().authenticated() .and() .csrf().disable() .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS); return http.build(); } }
|
配置顺序:哪个先匹配
Spring Security 按照 @Bean 定义的顺序依次匹配 SecurityFilterChain。第一个匹配的链生效,后续的链不再处理该请求。
securityMatcher() 决定了哪些请求由该链处理。匹配规则与 antMatchers() 相同。
注意事项



- 每个
SecurityFilterChain 都应该有明确的 securityMatcher(),避免请求被意外匹配到错误的链
- 全局配置(如
WebSecurityConfigurerAdapter 中的 configure(WebSecurity))仍然生效,影响所有链
- CSRF 防护在 API 链中通常关闭,但在 Web 链中应该启用
- 会话管理策略在不同链中可以不同(Web 链用 SESSION,API 链用 STATELESS)