在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的请求成功,因此我认为基本身份验证无法正常工作。从调试输出看起来好像没有设置身份验证标头。什么使这项工作?
答案 0 :(得分:10)
问题是您以错误的方式使用RestTemplateBuilder
。 RestTemplateBuilder
是不可变的。因此,在执行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;
}