2017-08-14 177 views
2

在春天引導我試圖創建一個使用春季啓動RestTemplate基本身份驗證使用RestTemplateBuilder

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

然後我在服務類注入RestTemplate一個RestTemplate將使用基本身份驗證

@Autowired 
private RestTemplate restTemplate; 

但是,我的請求失敗,出現401未經授權的異常:

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

使用另一個REST客戶端(Postman),對相同URL的請求成功,因此我假設基本身份驗證無法正常工作。從調試輸出看起來好像認證頭沒有被設置。什麼會使這項工作?

+0

去調試,看看它是否正確設置頭,我的猜測是你有更多的resttemplate在你的春天的上下文。 – Jaiwo99

+0

春天裏只有一個RestTemplate。 –

+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; 
} 
3

的問題是,你是在一個錯誤的方式使用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(); 
} 

這將使用特定配置的實例。

+0

非常感謝,是的,這是問題所在。 –