spring 如何在Sping Boot 中为不同的路由配置不同的OAuth2提供程序?

polhcujo  于 2023-03-07  发布在  Spring
关注(0)|答案(1)|浏览(162)

我正在构建一个SpringBoot应用程序,它有两组路由:一个用于应使用Amazon Cognito进行身份验证的CMS相关功能,另一个用于应使用Firebase身份验证的应用程序相关功能。
我已经为OAuth2身份验证设置了基本的SpringSecurity配置,但是我不确定如何为不同的路由集配置不同的OAuth2提供程序。
以下是我当前的配置:

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

    @Autowired
    lateinit var memberRepository: MemberRepository

    @Bean
    @Throws(Exception::class)
    fun filterChain(http: HttpSecurity): SecurityFilterChain {
        return http
            .authorizeHttpRequests { authorize ->
                authorize
                    .antMatchers("/cms/**").authenticated()
                    .antMatchers("/app/**").authenticated()
                    .anyRequest().permitAll()
            }
            .oauth2ResourceServer { oauth2 ->
                oauth2
                    .jwt { jwt ->
                        jwt.jwtAuthenticationConverter(AwsCognitoJwtAuthenticationConverter(memberRepository))
                    }
            }.build()
    }
}

如您所见,authorizeRequests部分当前设置为要求对/cms和/app下的所有路由进行身份验证。但是,我希望对/cms路由使用Amazon Cognito,对/app路由使用Firebase身份验证。
如何配置Spring Security,使其对不同的路由集使用不同的OAuth2提供程序?如有任何帮助或指导,我们将不胜感激。提前感谢!
如何向application. yml添加多个资源服务器?

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: https://cognito-idp.eu-central-1.amazonaws.com/...

编辑:我的项目是一个用于CMS的简单REST API(客户管理系统)和移动应用程序。用户登录和注册仅通过移动应用程序上的客户端和Firebase身份验证以及CMS上的AWS Cognito(通过NextAuth)进行,这是一个Next.js Web应用程序。REST API应使用Cognito检查以"/cms "开头的所有路由是否具有有效的承载令牌,并检查以"/"开头的所有路由是否具有有效的承载令牌应用程序"有一个使用Firebase身份验证的有效承载令牌。也许有一个更简单的解决方案,但我对Spring Boot相当陌生。

l7wslrjt

l7wslrjt1#

您处于多租户场景中,应该覆盖AuthenticationManagerResolver,而不仅仅是Authentication转换器。

http.oauth2ResourceServer(oauth2 -> oauth2.authenticationManagerResolver(...));

您在那里配置的bean可以根据JWT的发行者从“Cognito”身份验证管理器切换到“Firebase”身份验证管理器。
我详细介绍了this tutorial中的两个解决方案:一个Java配置文件为0(只有属性),使用的是我的Sping Boot 启动器,另一个使用的是“官方”启动器。
请注意,使用我在此处公开的解决方案,Cognito和Firebase身份都将在所有路由上接受(但是您仍然可以在@PreAuthorize规则中检查角色甚至颁发者)。如果您不接受这一点,然后为每个路由定义一个安全筛选器链bean(例如使用http.securityMatcher(new AntPathRequestMatcher("/cms/**"))),如果颁发者不是您期望的路由颁发者,则在Authentication Manager解析器中抛出异常。
但是,在每个路由只接受一个发布者的情况下,也许您应该考虑将应用程序拆分为两个,每个都使用标准的单租户配置?

相关问题