配置多个OAuth2授权服务器和单个资源服务器之间的通信

时间:2019-05-21 18:44:22

标签: spring-boot spring-security spring-webflux okta spring-oauth2

我目前正在设置一台资源服务器,该服务器将验证来自各种授权服务器的访问令牌。

春季安全性(也同时使用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应用程序中启用此功能的标准方法吗?

此外,我遇到了this问题,但我不知道我是否能够在该项目的背景下设置“联邦提供者”。但是,如果该方法是我想知道的最佳实践。但是,我认为在Okta级别上,身份验证服务器访问策略上的联合代理模式正在发生某种情况??

1 个答案:

答案 0 :(得分:0)

<块引用>

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

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