2013-10-04 25 views
2

我正在使用spring 3,2,並從一個只需要基本身份驗證的休息API使用數據的應用程序......事情是,我無法登錄到api ,我得到的是401基本身份驗證與彈簧3.2。授權參數不是在標題

的配置如下:

首先,憑據提供

<bean id="credentialProvider" class="org.apache.http.impl.client.BasicCredentialsProvider" /> 

訪問RESTful服務授權範圍。既然我們要使用一切這個模板,我們用默認設置就

<bean id="authScope" class="org.apache.http.auth.AuthScope"> 
    <constructor-arg name="host"> <null /> </constructor-arg> 
    <constructor-arg name="port"> <value>-1</value> </constructor-arg> 
    <constructor-arg name="realm"> <null /> </constructor-arg> 
    <constructor-arg name="scheme"> <null /> </constructor-arg> 
</bean> 

用戶名和密碼憑據訪問API服務

<bean id="credentials" class="org.apache.http.auth.UsernamePasswordCredentials"> 
    <constructor-arg name="userName" value="${dataApi.username}"></constructor-arg> 
    <constructor-arg name="password" value="${dataApi.password}"></constructor-arg> 
</bean> 

創建憑據提供

<bean id="methodInvoke" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject" ref="credentialProvider" /> 
    <property name="targetMethod" value="setCredentials" /> 
    <property name="arguments"> 
    <list> 
     <ref local="authScope" /> 
     <ref local="credentials" /> 
    </list> 
    </property> 
</bean> 

我們必須使用代理服務器,所以...

<bean id="proxyHttpClient" class="com.cibbva.commerce360.utils.ProxyHttpClient"> 
    <constructor-arg name="host" value="${proxy.hostname}" /> 
    <constructor-arg name="port" value="${proxy.port}" /> 
    <constructor-arg name="user" value="${proxy.username}" /> 
    <constructor-arg name="pass" value="${proxy.password}" /> 
    <constructor-arg name="conman" ref="clientConnectionManager"></constructor-arg> 
    <property name="credentialsProvider" ref="credentialProvider" /> 
</bean> 

的clientConnectionManager它的定義爲:

<bean id="clientConnectionManager" class="org.apache.http.impl.conn.PoolingClientConnectionManager"> 
    <property name="defaultMaxPerRoute" value="${dataAPi.connection.maxPerRoute}"></property> 
    <property name="maxTotal" value="${dataAPi.connection.maxTotal}"></property> 
</bean> 

最後的requestFactory和restTemplate:

<bean id="requestFactory" class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory"> 
    <constructor-arg ref="proxyHttpClient" /> 
</bean> 

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"> 
    <constructor-arg name="requestFactory" ref="requestFactory" /> 
</bean> 

我認爲這個問題是由於授權參數沒有被添加到的頭要求,尋找在調試模式下,我看到以下內容:

DEBUG org.apache.http.headers - >> GET /xxxx/xxxxxx?xxxx HTTP/1.1 
DEBUG org.apache.http.headers - >> Accept: application/json, application/*+json 
DEBUG org.apache.http.headers - >> Host: hostname 
DEBUG org.apache.http.headers - >> Connection: Keep-Alive 
DEBUG org.apache.http.headers - >> User-Agent: Apache-HttpClient/4.2.3 (java 1.5) 
DEBUG org.apache.http.wire - << "HTTP/1.1 401 No Autorizado[\r][\n]" 

正如你看到的,沒有一個標題中的第u個信息。要放棄錯誤的用戶名和密碼的可能性,我使用curl提出同樣的要求:

curl -v --user 'username:pasword' https://xxxx/xxxxxx?xxxx 

輸出是:

SSL certificate verify ok. 
Server auth using Basic with user 'user' 
GET xxxx/xxxxxx?xxxx HTTP/1.1 
Authorization: Basic Y29tL.... 
User-Agent: curl/7.29.0 
Host: hostname 
Accept: */* 
HTTP/1.1 404 No Encontrado 

總之,我怎麼能參數Authorization添加到頭我的要求?

太謝謝你了!

+0

所以當使用spring時,你使用的是https嗎? –

+0

是的,在春天我也在使用https – Rumal

回答

1

好的,我終於找到了解決這個問題的方法。我所做的就是創建一個實現ClientHttpRequestInterceptor一類,然後手動將認證頭,代碼是一樣的東西:

public class RequestHeaderIntercepter implements ClientHttpRequestInterceptor{ 

    @Override 
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, 
    ClientHttpRequestExecution execution) throws IOException { 
    HttpRequestWrapper requestWrapper = new HttpRequestWrapper(request); 
    requestWrapper.getHeaders().set("Authorization", "encoded username:password"); 
    return execution.execute(request, body); 
    } 
} 

在這之後,你必須註冊監聽到restTemplate,這一切!該請求被攔截並且授權參數被添加到標題。