gpt4 book ai didi

java - 使用用户名和密码连接到另一个服务的 Spring Security 5.2/WebClient 方式是什么?

转载 作者:行者123 更新时间:2023-12-02 09:07:05 25 4
gpt4 key购买 nike

我们目前有几个 Spring Boot 应用程序使用服务帐户连接到其他服务。到目前为止,我们在 RestTemplate 上使用 OAuth2ClientContext 的 AccessTokenRequest 来放入服务帐户的用户和密码,并使用返回的 OAuth token 连接到其他服务。

现在我们正在使用 Spring Boot 5.2 构建一个新应用程序,并且由于现在应该使用新的 Spring Security OAuth,因此单独的 OAuth 库已被弃用,我们还希望将 RestTemplate 解决方案替换为 WebClient 解决方案RestTemplate 也将在不久的将来被弃用。我尝试了多种检索 token 的方法,但找不到有效的解决方案。

我发现像 Spring Security 5 Replacement for OAuth2RestTemplate 中提到的设置,但无法将用户名和密码放入 WebClient 中。我发现使用 ClientRegistrationRepository 而不是 ReactiveClientRegistrationRepository 的其他方法,其中一些方法实际上具有将用户名和密码放入 AuthorizedClientManager 中的选项(如 How to re-initialize password grant in Spring security 5.2 OAuth ),该选项在实例化过滤器时成为参数,但不知何故我总是结束收到这样的消息:无论我在 application.yaml 中放入什么属性,都找不到 ClientRegistrationRepository 的 Bean(也许这不起作用,因为该应用程序是 MVC 应用程序而不是 WebFlux 应用程序?)

我知道我需要将授权授予类型设置为“密码”,但已经有人询问如何使其正常工作( Spring Security 5.2.1 + spring-security-oauth2 + WebClient: how to use password grant-type ),但该问题还没有答案。

那么......他们是否“弃用”了这种使用用户名和密码检索 token 并使用该 token 连接到 Spring Security 5.2 中的另一个服务的简单方法?如果是的话,现在应该使用什么?

最佳答案

是的,RestTemplate 和 OAuthRestTemplate 均已弃用。 WebClient 开箱即用地支持 OAuth。您无需执行任何特殊操作或自行添加任何 header 。这实际上是非常微不足道的。

创建一个公开 WebClient bean 的配置类,确保将客户端存储库作为参数。在该方法中,您将存储库传递到过滤器函数中:

@Bean
public WebClient webClient(ReactiveClientRegistrationRepository clientRegistrations) {
return WebClient.builder().filter(filterFunction(clientRegistrations))
.baseUrl(String.format("http://%s:8080", getHostName()))
.build();

}

private ServerOAuth2AuthorizedClientExchangeFilterFunction filterFunction(ReactiveClientRegistrationRepository clientRegistrations) {
ServerOAuth2AuthorizedClientExchangeFilterFunction filterFunction = new ServerOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrations, new UnAuthenticatedServerOAuth2AuthorizedClientRepository());
filterFunction.setDefaultClientRegistrationId("myKey");
return filterFunction;
}

注意:在过滤器函数中,将“myKey”替换为与 application.properties 中的以下属性结构匹配的内容(将属性路径中的 myKey 替换为您的姓名):

spring.security.oauth2.client.registration.myKey.authorization-grant-type=password
spring.security.oauth2.client.registration.myKey.client-id=xxx
spring.security.oauth2.client.registration.myKey.client-secret=xxx

spring.security.oauth2.client.provider.myKey.token-uri=http://localhost:8080/oauth/token

Aaaanddd...你完成了!还内置了 OAuth token 刷新。

关于java - 使用用户名和密码连接到另一个服务的 Spring Security 5.2/WebClient 方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59725712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com