我目前正在设置一台资源服务器,该服务器将验证来自各种授权服务器的访问令牌。
春季安全性(也同时使用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级别上,身份验证服务器访问策略上的联合代理模式正在发生某种情况??
答案 0 :(得分:0)
无论哪种方式,这是在具有 Spring Security 和 WebFlux 的 Spring 应用程序中启用此功能的标准方法吗?
没有。更重要的是,您提供的示例将不起作用。您可以调查 ServerHttpSecurity
实现并了解原因。实际上,当您调用 oauth2ResourceServer()
时,它会设置新的 OAuth2ResourceServerSpec
或返回可以修改的旧的。因此,在您的情况下,只会应用第二个 JwtDecoder,因为它会覆盖第一个。如果要为每个路径配置 oauth2ResourceServer,则必须定义多个 SecurityWebFilterChain
,如在此处发布的 https://stackoverflow.com/a/54792674/1646298 .