配置多个 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()调用看起来有点好笑,我的印象是这些链式调用只是在引擎盖下创建多个网络过滤器?无论哪种方式,这是否是在具有Spring Security和WebFlux的Spring应用程序中启用此功能的标准方法?

此外,我遇到了这个 SO 问题,但我不知道我是否能够在该项目的上下文中设置"联合提供程序"。但是,如果这种方法是我想知道的最佳实践。但是,我认为这在某种程度上发生在 Okta 级别,身份验证服务器访问策略上的联合代理模式......?

无论哪种方式,这都是在具有Spring Security和WebFlux的Spring应用程序中启用此功能的标准方法吗?

不。更重要的是,您提供的示例将不起作用。您可以调查ServerHttpSecurity实现并了解原因。实际上,当您调用oauth2ResourceServer()时,它会设置新OAuth2ResourceServerSpec或返回可以修改的旧。因此,在您的情况下,只会应用第二个 JwtDecoder,因为它会覆盖第一个。如果要按路径配置 oauth2ResourceServer,则必须定义多个SecurityWebFilterChain,如此处发布 https://stackoverflow.com/a/54792674/1646298 所示。

相关内容

最新更新