使用RestTemplateBuilder进行Spring Boot RestTemplate基本身份验证

时间:2017-08-14 09:03:03

标签: spring rest spring-boot

在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的请求成功,因此我认为基本身份验证无法正常工作。从调试输出看起来好像没有设置身份验证标头。什么使这项工作?

2 个答案:

答案 0 :(得分:10)

问题是您以错误的方式使用RestTemplateBuilderRestTemplateBuilder是不可变的。因此,在执行builder.basicAuthorization("username", "password")时,您实际上会获得BasicAuthorizationInterceptor添加和配置RestTemplateBuilder的新实例。 (这适用于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();
}

将使用具体配置的实例。

答案 1 :(得分:0)

一种解决方案是按如下方式创建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;
}