【问题标题】:Spring Boot RestTemplate Basic Authentication using RestTemplateBuilder使用 RestTemplateBuilder 的 Spring Boot RestTemplate 基本身份验证
【发布时间】:2018-01-22 01:57:58
【问题描述】:

在 Spring Boot 中,我正在尝试创建一个 RestTemplate,它将使用基本身份验证

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
    builder.basicAuthorization("username", "password");
    RestTemplate template = builder.build();
    return template;
}

然后我将 RestTemplate 注入到我的服务类中

@Autowired
private RestTemplate restTemplate;

但是,我的请求因 401 未经授权的异常而失败:

Caused by: org.springframework.web.client.HttpClientErrorException: 401 Unauthorized

使用另一个 REST 客户端(邮递员)对同一 URL 的请求成功,因此我认为基本身份验证无法正常工作。从调试输出看起来好像没有设置身份验证标头。什么会使这项工作发挥作用?

【问题讨论】:

  • 去调试看看它是否正确设置了标题,我猜你的spring上下文中有更多的resttemplate。
  • spring 上下文中只有一个 RestTemplate。
  • 分享您的客户端代码..您如何发送请求
  • 问题在于您的配置,basicAuthorization 基本上是 new RestTemplateBuilder 的工厂方法,但您没有使用新创建的实例。使用return builder.basicAuthorization("username", "password").build(); 而不是您现在拥有的(或重用新创建的实例)。

标签: spring rest spring-boot


【解决方案1】:

问题是您以错误的方式使用RestTemplateBuilderRestTemplateBuilder 是不可变的。因此,在执行builder.basicAuthorization("username", "password") 时,您实际上获得了一个新实例,其中添加并配置了RestTemplateBuilderBasicAuthorizationInterceptor。 (这适用于RestTemplateBuilder 的所有配置方法,它们都会创建一个新复制的实例)。

但是您的代码正在丢弃该专门配置的实例,并且您基本上使用的是非安全默认 RestTemplateBuilder

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
    builder.basicAuthorization("username", "password");
    RestTemplate template = builder.build();
    return template;
}

这段代码应该换成这样的。

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
    return builder.basicAuthorization("username", "password").build();
}

这将使用专门配置的实例。

【讨论】:

  • 非常感谢,是的,这就是问题所在。
  • basicAuthorization 自 2.1.0 起已弃用,有利于 basicAuthentication(String username, String password)
【解决方案2】:

一种解决方案是按如下方式创建 RestTemplate:

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
    RestTemplate template = builder.build();
    template.setMessageConverters(
        Arrays.asList(
            new FormHttpMessageConverter(),
            new StringHttpMessageConverter()
        )
    );
    template.getInterceptors().add(new BasicAuthorizationInterceptor("username", "password"));

    return template;
}

【讨论】:

    猜你喜欢
    • 2014-03-26
    • 2017-12-22
    • 2012-02-21
    • 2019-04-25
    • 2014-09-22
    • 2016-08-24
    • 2014-03-22
    • 2017-07-31
    • 2021-12-28
    相关资源
    最近更新 更多