Spring Security 教程(12)、多个HttpSecurity

为什么需要多 SecurityFilterChain

Spring Security 配图
Spring Security 配图
Spring Security 配图

一个应用可能有多种安全需求:

  • 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/**") // 只匹配 /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/**") // 只匹配 /api 路径
.authorizeRequests()
.requestMatchers("/api/public/**").permitAll()
.requestMatchers("/api/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.csrf().disable() // API 通常关闭 CSRF
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS); // 无状态
return http.build();
}
}

配置顺序:哪个先匹配

Spring Security 按照 @Bean 定义的顺序依次匹配 SecurityFilterChain。第一个匹配的链生效,后续的链不再处理该请求。

securityMatcher() 决定了哪些请求由该链处理。匹配规则与 antMatchers() 相同。

注意事项

multiple-httpsecurity 配图
multiple-httpsecurity 配图
multiple-httpsecurity 配图

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