Spring security 使用Spring Security 5.2+在多线程上下文中高效地授权客户端凭证OAuth2Client Request;
随着SpringSecurity5.2中引入了Spring security 使用Spring Security 5.2+在多线程上下文中高效地授权客户端凭证OAuth2Client Request;,spring-security,Spring Security,随着SpringSecurity5.2中引入了OAuth2AuthorizedClient管理器,有可能使用HTTP客户端或非WebClient的抽象来处理OAuth2客户端的授权 我们可以用像这样的东西 OAuth2AuthorizedClient authorizedClient = authorizedClientManager.authorize( OAuth2AuthorizeRequest .withClientRegistrationId("registra
OAuth2AuthorizedClient管理器
,有可能使用HTTP客户端或非WebClient
的抽象来处理OAuth2客户端的授权
我们可以用像这样的东西
OAuth2AuthorizedClient authorizedClient = authorizedClientManager.authorize(
OAuth2AuthorizeRequest
.withClientRegistrationId("registration-id")
.principal("client-id")
.build()
);
参考:
虽然我现在可以从OAuth2AuthorizedClient
获取访问令牌(例如String accessToken=authorizedClient.getAccessToken().getTokenValue()
),但我必须始终首先调用authorizedClient.authorize(oAuth2AuthorizeRequest)
以确保我在调用下游服务之前拥有有效的访问令牌。如果访问令牌过期,则authorize
调用将对令牌端点执行客户端凭据调用,并使用新令牌返回响应。但是,如果我的microservice同时收到多个调用(例如,在不同的请求线程上),则理论上,authorize
调用可以为每个请求线程调用令牌端点,因为每个请求线程将确定访问令牌已过期,并在调用下游服务之前请求一个新令牌。只有使用有效令牌更新了OAuth2AuthorizedClientRepository
,请求线程才会停止调用更多令牌端点调用。此外,可能会有一系列令牌端点响应,这些响应将相互覆盖,最终响应的访问令牌将在存储库中持久化,直到下一个到期
我想找到一种方法,在多线程上下文中有效地授权客户端凭据客户端,这样就不会触发令牌请求的竞争条件。我能想到的唯一解决方法是在访问令牌到期之前安排授权,或者使用Spring安全性来防止在等待第一个响应时进行多个令牌端点调用
如有任何建议,将不胜感激