当前位置: 首页 > 知识库问答 >
问题:

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

桑思远
2023-03-14

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

我发现了类似Spring Security 5中提到的OAuth2RestTemplate的设置,但无法在WebClient中放置用户名和密码。我发现了其他使用ClientRegistrationRepository而不是ReactiveClientRegistrationRepository的方法,其中一些方法实际上有选项(比如如何在Spring security 5.2OAuth中重新初始化密码授权),将用户名和密码放入AuthorizedClientManager中,当实例化过滤器时,该管理器将成为参数,但不知何故,我最终总是得到这样的消息,即无论我在application.yaml中放了什么属性,都找不到ClientRegistrationRepository的Bean(也许这不起作用,因为应用程序是MVC应用程序,而不是WebFlux应用程序?)

我知道我需要将authorization-grant-type设置为'password',但是已经有人询问如何使其工作(Spring Security 5.2.1+spring-security-oauth2+WebClient:how to use password grant-type),但还没有对该问题的答案。

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

共有1个答案

慕烨烁
2023-03-14

是,RestTemplate和OAuthRestTemplate都不推荐使用。WebClient支持开箱即用的OAuth。您不需要做任何特别的事情,也不需要自己添加任何标题。其实极其琐碎。

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

@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;
    }

注意:在filter函数中,将“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
 类似资料:
  • 我正在使用com.jcraft.jsch.jsch创建一个SFTP连接。 我的SSH密钥被设置为可以直接SSH到服务器,而不需要用户名或密码。 我的公钥在中的authorized_key文件中 我在本地计算机上的SSH密钥在 此外,我在此目录中还有一个配置文件和一个文件。 为了进行双重检查,我确保中的公钥在远程服务器的文件中。 我正在开发一个创建文件的GUI程序。有了这个文件,我希望能够将它存储在

  • 我正在使用cloudera VM,我想连接到beeline,但当我离开时,它询问用户名和密码,它没有连接。谁能告诉我用户名和密码。 !连接JDBC:hive2://localhost:10000/连接到JDBC:hive2://localhost:10000/输入JDBC:hive2://localhost:10000/输入JDBC:hive2://localhost:10000/输入密码:错误:

  • 我正在构建一个Java Web应用程序,当经理批准他们的请求时,它会自动授予用户对其Windows PC的管理权限。 为了实现这一点,我将编写一个脚本来自动远程访问用户的计算机,并将他们添加到计算机的管理组中。我想为了做到这一点,我需要一个管理服务帐户来访问所有的计算机。 我的问题是,我如何安全地存储管理服务帐户信息?应用程序每次需要访问并授予用户管理员权限时都需要凭据,那么我如何让应用程序在没有

  • 在通常的场景中,连接字符串包含纯文本的密码,但这可以被Wireshark捕获,因此我想在一个连接字符串中使用加密的密码。我从Postgres文档中找到了以下摘录:

  • 做这件事最好的方法是什么? 通常,我们会对其进行散列,但这是不可能的,因为散列是单向的,我们需要将真正的密码传递给Jira,而不是散列。

  • 问题内容: 我在应用程序中使用MongoDB 3.2。下面的代码演示了数据库初始化逻辑: 这段代码工作正常,现在我想向数据库引入访问级别分离。 步骤如下: 定义用户: 重新创建认证模式MongoDB的3.2服务: 。并运行它。 将连接字符串更改为 其中= 和= 。 使用相同的凭据检查IDEA中已验证的连接,一切正常。 执行我的应用程序并获取异常。 我的问题: 如何使用用户名和密码连接Java中的M