Spring Boot多FilterSecurityChain失效问题求助
问题分析与解决方案
我为Spring Boot应用配置了两个FilterSecurityChain Bean,意图实现:
/api/api1/**、/api/api2/**仅接受issuer-1签发的JWT/api/api3/**、/api/api4/**仅接受issuer-2签发的JWT
但测试出现异常:
- issuer-1的JWT能通过/api/api3的认证(预期应该拒绝)
- issuer-2的JWT无法通过/api/api3的认证(预期应该通过)
调整@Order顺序后,异常反转,说明第一个链会处理所有请求,第二个链未被触发。
问题根源
当前的两个FilterSecurityChain没有配置请求匹配器,Spring Security会按@Order优先级,让第一个链处理所有HTTP请求,第二个链永远不会被执行。第一个链的认证逻辑(issuer-1)会被应用到所有路径,包括/api/api3/**,导致不符合预期的结果。
解决方案
给每个FilterSecurityChain添加requestMatcher,明确指定该链负责处理的路径,让Spring Security能根据请求路径匹配到对应的安全链。
修正后的代码:
@Configuration class SecurityConfig { @Bean @Order(0) fun securityFilterChainExternalEndpoints(http: HttpSecurity, appProperties: AppProperties): SecurityFilterChain { val customAuthenticationManagerResolver = JwtIssuerAuthenticationManagerResolver( "issuer-1" ) http .csrf().disable() // 指定该链仅处理/api/api1/**和/api/api2/**的请求 .requestMatchers() .antMatchers("/api/api1/**", "/api/api2/**") .and() .authorizeRequests() .anyRequest().authenticated() .and() .oauth2ResourceServer { it.authenticationManagerResolver(customAuthenticationManagerResolver) } return http.build() } @Bean @Order(1) fun securityFilterChainInternalEndpoints(http: HttpSecurity, appProperties: AppProperties): SecurityFilterChain { val customAuthenticationManagerResolver = JwtIssuerAuthenticationManagerResolver( "issuer-2" ) http .csrf().disable() // 指定该链仅处理/api/api3/**和/api/api4/**的请求 .requestMatchers() .antMatchers("/api/api3/**", "/api/api4/**") .and() .authorizeRequests() .anyRequest().authenticated() .and() .oauth2ResourceServer { it.authenticationManagerResolver(customAuthenticationManagerResolver) } return http.build() } }
关键说明
- requestMatchers():用来限定当前
FilterSecurityChain仅处理匹配指定路径的请求,Spring Security会遍历所有链,找到第一个匹配的链来处理请求。 - authorizeRequests().anyRequest().authenticated():在指定了
requestMatchers后,这里的anyRequest仅针对该链匹配的路径,确保这些路径必须经过认证。 - @Order:保持顺序,优先级高的链(Order值小)先被匹配,确保不同路径对应到正确的认证逻辑。
测试验证:
- 用issuer-1的JWT调用/api/api1 → 正常通过
- 用issuer-2的JWT调用/api/api1 → 返回401
- 用issuer-1的JWT调用/api/api3 → 返回401
- 用issuer-2的JWT调用/api/api3 → 正常通过
内容的提问来源于stack exchange,提问作者Sara Menoncin
相关产品推荐
相关产品推荐

