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

Spring Boot 3.2.x多SecurityFilterChain与JwtDecoder路径匹配异常排查

问题根源与解决方案

你的第二个SecurityFilterChain未生效的核心原因是没有为每个FilterChain指定securityMatcher,导致请求被第一个优先级更高的FilterChain完全拦截处理,后续FilterChain没有执行机会。

原理说明

Spring Security中多个SecurityFilterChain会按@Order注解的数值从小到大依次执行:

  • 未指定securityMatcher的FilterChain默认会匹配所有请求
  • 一旦某个FilterChain匹配到请求并完成授权处理,后续的FilterChain就不会再介入你的场景中,@Order(1)的FilterChain没有限定匹配范围,所有请求(包括/quick-questions)都会被它处理,直接执行permitAll规则,第二个FilterChain根本不会被触发。

修正方案

给每个SecurityFilterChain明确指定securityMatcher,限定各自负责的路径范围,确保请求只会进入对应的FilterChain。以下是调整后的代码示例:

1. 聊天机器人相关FilterChain(负责/quick-questions路径)

@Order(1)
@Bean
SecurityFilterChain chatbotFilterChain(HttpSecurity http) throws Exception {
    http
            .securityMatcher("/quick-questions") // 仅匹配该路径
            .csrf(AbstractHttpConfigurer::disable)
            .formLogin(AbstractHttpConfigurer::disable)
            .oauth2ResourceServer((oauth2) -> oauth2
                    .jwt((jwt) -> jwt.jwtAuthenticationConverter(jwtAuthenticationConverter).decoder(chatbotJwtDecoder()))
                    .authenticationEntryPoint(delegatedAuthenticationEntryPoint)
                    .accessDeniedHandler(delegatedAccessDeniedHandler))
            .authorizeHttpRequests(request -> {
                request.requestMatchers("/quick-questions").permitAll();
            })
            .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS));

    return http.build();
}

2. 会员相关FilterChain(负责会员专属路径,比如/member/**)

@Order(2)
@Bean
SecurityFilterChain memberFilterChain(HttpSecurity http) throws Exception {
    http
            .securityMatcher("/member/**") // 仅匹配会员相关路径
            .csrf(AbstractHttpConfigurer::disable)
            .formLogin(AbstractHttpConfigurer::disable)
            .oauth2ResourceServer((oauth2) -> oauth2
                    .jwt((jwt) -> jwt.jwtAuthenticationConverter(jwtAuthenticationConverter).decoder(memberJwtDecoder()))
                    .authenticationEntryPoint(delegatedAuthenticationEntryPoint)
                    .accessDeniedHandler(delegatedAccessDeniedHandler))
            .authorizeHttpRequests(request -> {
                request.anyRequest().authenticated(); // 该路径下所有请求需认证
            })
            .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS));

    return http.build();
}

额外注意点

  • 如果你的需求是同一个路径需要根据不同条件(比如请求头、JWT issuer)使用不同的JWT解码器,那么应该在同一个FilterChain中配置多个认证提供者,而不是拆分多个FilterChain。
  • 每个FilterChain的授权规则要覆盖所有匹配到的请求,避免出现未定义规则的请求被Spring Security默认拒绝。

内容的提问来源于stack exchange,提问作者Alpcan Yıldız

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:53:15