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