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

Spring Boot如何为不同路由配置不同OAuth2认证提供商?

为不同路由配置不同OAuth2资源服务器认证提供商

要实现/cms/**路由使用Amazon Cognito认证、/app/**路由使用Firebase Authentication认证,可以通过多个SecurityFilterChain Bean结合多提供商配置来实现,具体步骤如下:


1. 配置application.yml中的多OAuth2资源服务器提供商

在配置文件中分别定义Cognito和Firebase的JWT issuer信息:

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          providers:
            cognito:
              issuer-uri: https://cognito-idp.eu-central-1.amazonaws.com/你的用户池ID
            firebase:
              issuer-uri: https://securetoken.google.com/你的Firebase项目ID

注:Firebase的issuer-uri格式固定为https://securetoken.google.com/[你的Firebase项目ID],可在Firebase控制台的「项目设置」→「服务账号」中确认项目ID。


2. 创建多个SecurityFilterChain Bean

通过定义多个SecurityFilterChain,每个链对应一组路由和对应的认证规则,使用@Order指定执行优先级(数字越小越先匹配):

@Configuration
@EnableWebSecurity
@EnableMethodSecurity(securedEnabled = true, prePostEnabled = true)
class SecurityConfiguration {

    @Autowired
    lateinit var memberRepository: MemberRepository

    // 处理/cms/**路由,使用Cognito认证
    @Bean
    @Order(1)
    fun cmsSecurityFilterChain(http: HttpSecurity): SecurityFilterChain {
        return http
            .securityMatcher("/cms/**")
            .authorizeHttpRequests { authorize ->
                authorize.anyRequest().authenticated()
            }
            .oauth2ResourceServer { oauth2 ->
                oauth2
                    .jwt { jwt ->
                        // 保留自定义的Cognito JWT转换器
                        jwt.jwtAuthenticationConverter(AwsCognitoJwtAuthenticationConverter(memberRepository))
                            // 绑定配置文件中的cognito提供商
                            .provider("cognito")
                    }
            }
            .build()
    }

    // 处理/app/**路由,使用Firebase认证
    @Bean
    @Order(2)
    fun appSecurityFilterChain(http: HttpSecurity): SecurityFilterChain {
        return http
            .securityMatcher("/app/**")
            .authorizeHttpRequests { authorize ->
                authorize.anyRequest().authenticated()
            }
            .oauth2ResourceServer { oauth2 ->
                oauth2
                    .jwt { jwt ->
                        // 绑定配置文件中的firebase提供商
                        jwt.provider("firebase")
                        // 若Firebase需要自定义JWT转换器,可在此添加,默认转换器已支持标准JWT验证
                    }
            }
            .build()
    }

    // 处理其余所有请求,允许匿名访问
    @Bean
    @Order(3)
    fun defaultSecurityFilterChain(http: HttpSecurity): SecurityFilterChain {
        return http
            .authorizeHttpRequests { authorize ->
                authorize.anyRequest().permitAll()
            }
            .build()
    }
}

关键说明

  • securityMatcher:替代原配置中的antMatchers,明确当前FilterChain负责处理的路径,避免规则混淆。
  • @Order:确保Spring Security按顺序匹配请求,先匹配/cms/**和/app/**,最后处理其余请求。
  • 提供商绑定:通过jwt.provider("xxx")将认证配置与application.yml中定义的对应提供商关联,Spring Security会自动使用该提供商的issuer-uri验证JWT签名和有效性。

内容的提问来源于stack exchange,提问作者Just A Question

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 01:13:26