You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()
    }
}

关键说明

  1. requestMatchers():用来限定当前FilterSecurityChain仅处理匹配指定路径的请求,Spring Security会遍历所有链,找到第一个匹配的链来处理请求。
  2. authorizeRequests().anyRequest().authenticated():在指定了requestMatchers后,这里的anyRequest仅针对该链匹配的路径,确保这些路径必须经过认证。
  3. @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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 20:35:12