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

J K*_*urz 3 rest spring spring-boot

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

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

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

@Autowired
private RestTemplate restTemplate;
Run Code Online (Sandbox Code Playgroud)

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

Caused by: org.springframework.web.client.HttpClientErrorException: 401 Unauthorized
Run Code Online (Sandbox Code Playgroud)

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

M. *_*num 13

问题是你使用的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;
}
Run Code Online (Sandbox Code Playgroud)

此代码应替换为此类代码.

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

哪个将使用特定配置的实例.

  • basicAuthorization 自 2.1.0 起弃用,支持 basicAuthentication(String username, String password) (5认同)

J K*_*urz 1

一种解决方案是创建 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;
}
Run Code Online (Sandbox Code Playgroud)