spring-boot - 配置多个 OAuth2 授权服务器和单个资源服务器之间的通信
问题描述
我目前正在设置一个资源服务器,它将验证来自各种授权服务器的访问令牌。
Spring 安全性(也使用 Okta 安全启动器)似乎只允许我设置单个颁发者 URI。
我设法找到了一个可行的解决方案,但我不确定这是否是最佳实践/标准方式。在下面的代码片段中,为了简单起见,我使用 Spring 的 Java Config 明确设置了资源。
@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
http
.authorizeExchange()
.pathMatchers("/api/protected/by/authserver1")
.and()
.oauth2ResourceServer()
.jwt()
.jwtDecoder(ReactiveJwtDecoders.fromOidcIssuerLocation("https://authserver1")
.and()
.and()
.authorizeExchange()
.pathMatchers("/api/protected/by/authserver2")
.and()
.oauth2ResourceServer()
.jwt()
.jwtDecoder(ReactiveJwtDecoders.fromOidcIssuerLocation("https://authserver2");
return http.build()
}
这似乎完全按预期工作,从一个身份验证服务器铸造的令牌并在验证另一个接收 401 的端点上使用。当铸造的令牌在其各自的端点上使用时,它们被成功验证。
.and()
背靠背调用看起来有点好笑,我的印象是这些链接调用只是在后台创建多个 Web 过滤器?无论哪种方式,这是在具有 Spring Security 和 WebFlux 的 Spring 应用程序中启用此功能的标准方式吗?
此外,我遇到了这个SO question,但我不知道我能否在这个项目的上下文中设置一个“联合提供者”。但是,如果这种方法是我想知道的最佳实践。但是,我认为这在某种程度上发生在 Okta 级别,身份验证服务器访问策略上的联合代理模式......?
解决方案
无论哪种方式,这是在具有 Spring Security 和 WebFlux 的 Spring 应用程序中启用此功能的标准方式吗?
不,更何况你提供的例子是行不通的。您可以调查ServerHttpSecurity
实施并了解原因。实际上,当您调用oauth2ResourceServer()
它时,它会设置新OAuth2ResourceServerSpec
的或返回可以修改的旧的。因此,在您的情况下,只会应用第二个 JwtDecoder,因为它会覆盖第一个。如果您想为每个路径配置 oauth2ResourceServer ,则必须定义多个SecurityWebFilterChain
,如此处发布的https://stackoverflow.com/a/54792674/1646298。
推荐阅读
- java - 如何使用 Java Stream API 从 Map 中提取特定实例变量的值?
- android - Seekbar 正在崩溃的应用程序
- php - 如何在 php7 (plesk onyx) 上升级 timezonedb/timelib?
- ios - 如何在折线图中显示第一个值和最后一个值
- spring - 来自两个不同 Kafka 代理的 Spring Cloud Stream Processor
- javascript - 使用 Ajax 在 WordPress 中插入数据
- javascript - 如何迭代谷歌文档中的所有元素?
- python - 为什么 ffmpeg 需要这么长时间才能从高分辨率 gif 解码 1 帧
- javascript - 如何有条件地将查询参数添加到 Vue.js 中的路由?
- java - 使用 HttpClient 发布返回错误请求