在Spring 3.1中使用Basic Auth进行RestTemplate

时间:2012-01-28 21:32:46

标签: java spring restful-authentication resttemplate apache-httpclient-4.x

我们在Spring 3.0中使用RestTemplate和xml配置,它工作得很好。

<bean id="httpClient" class="org.apache.commons.httpclient.HttpClient"> 
    <!--  <constructor-arg ref="httpClientParams"/> --> 
</bean>

<bean id="httpClientFactory" class="org.springframework.http.client.CommonsClientHttpRequestFactory"> 
    <constructor-arg ref="httpClient"/> 
</bean>  

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

    <property name="messageConverters"> 
        <list> 
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
            </bean> 
            <bean class="org.springframework.http.converter.FormHttpMessageConverter"/> 
            <bean class="org.springframework.http.converter.StringHttpMessageConverter" />
        </list> 
    </property>
  </bean>

但是,当我们尝试迁移到Spring 3.1时,不推荐使用CommonsClientHttpRequestFactory类,并且不再使用公共HttpClient。

我试图使用HttpComponentsClientHttpRequestFactory类和Apache HttpClient设置类似的配置,但是没有得到如何设置凭证提供程序。

我们希望httpclient具有基本身份验证。有没有人这样做或任何指针将是很大的帮助。在此先感谢。

2 个答案:

答案 0 :(得分:18)

我终于得到了这个工作。不确定它是否是最佳的,因为这是第一个对我有用的解决方案。

`                   

<!-- Credentials provider needed by apache default http client -->
<bean id="credentialProvider" class="org.apache.http.impl.client.BasicCredentialsProvider" />

<!-- Used to invoke a method in BasicCredentialsProvider.  This has to be done this way as BasicCredentialsProvider does not take 
provider and credentials in constructor or setter method.  It has to set by invoking setCredentials() method and passing two arguments -->  
<bean id="methodInvoke" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject"><ref local="credentialProvider" /> </property>
    <property name="targetMethod" value="setCredentials"> </property>
    <property name="arguments"  >
        <list>
            <ref local="authScope" />
            <ref local="credentials" />
        </list>
    </property>
</bean>

<!-- Authorization scope for accessing restful service.  Since we want this template to be used for everything, we are setting up it with defaults -->
<bean id="authScope" class="org.apache.http.auth.AuthScope">
    <constructor-arg name="host"><null /></constructor-arg>
    <constructor-arg><value>-1</value> </constructor-arg>
    <constructor-arg><null /></constructor-arg>
    <constructor-arg><null /></constructor-arg>
</bean>

<!-- Username and Password Credentials to access restful service -->
<bean id="credentials" class="org.apache.http.auth.UsernamePasswordCredentials">
    <constructor-arg name="userName"><value>xxx</value></constructor-arg>
    <constructor-arg name="password"><value>xxx</value></constructor-arg>
</bean>

<!-- Client factory which uses Apache HttpClient implementation.  Note that it DO NOT use apache commons httpclient -->
<bean id="httpClientFactory" class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory"> 
    <constructor-arg ref="httpClient"/> 
</bean>

<bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">
    <property name="credentialsProvider" ref="credentialProvider"/>
</bean>

<!-- Rest template for Spring 3.1. Used HttpClientFactory to make request -->
  <bean id="restTemplate" name="restTemplate" class="org.springframework.web.client.RestTemplate" autowire-candidate="true">
        <constructor-arg ref="httpClientFactory" />

    <property name="messageConverters"> 
        <list> 
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
            </bean> 
            <bean class="org.springframework.http.converter.FormHttpMessageConverter"/> 
            <bean class="org.springframework.http.converter.StringHttpMessageConverter" />
        </list> 
    </property>
  </bean>`

答案 1 :(得分:0)

我能够使用Spring 4 RestTemplate

解决这个问题
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
        <constructor-arg ref="httpClientFactory" />
    </bean>

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

    <bean id="httpClient" factory-bean="httpClientBuilder" factory-method="build" />

    <bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder" factory-method="create">
        <property name="defaultRequestConfig" ref="requestConfig" />
        <property name="defaultCredentialsProvider" ref="credentialProvider"/>
    </bean>

    <bean id="requestConfig" factory-bean="requestConfigBuilder" factory-method="build" />

    <bean id="requestConfigBuilder" class="org.apache.http.client.config.RequestConfig" factory-method="custom">
        <property name="socketTimeout" value="${MILLISEC`enter code here`ONDS}" /> 
        <property name="connectTimeout" value="${MILLISECONDS}" /> 
    </bean> 

<bean id="credentials" class="org.apache.http.auth.NTCredentials">
        <constructor-arg value="${USER}" />
        <constructor-arg value="${PASSWORD}" />
        <constructor-arg value="" />
        <constructor-arg value="${DOMAIN}" />
    </bean>

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

    <!-- This is used to invoke a method in BasicCredentialsProvider.  This has to be done this way as BasicCredentialsProvider does not take 
    provider and credentials in constructor or setter method.  It has to set by invoking setCredentials() method and passing two arguments -->  
    <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 bean="authScope" />
                <ref bean="credentials" />
            </list>
        </property>
    </bean>

    <!-- Authorization scope for accessing restful service. Since we want this template to be used for everything, we are setting up it with defaults -->
    <bean id="authScope" class="org.apache.http.auth.AuthScope">
        <constructor-arg name="host"><null /></constructor-arg>
        <constructor-arg><value>-1</value> </constructor-arg>
        <constructor-arg><null /></constructor-arg>
        <constructor-arg><null /></constructor-arg>
    </bean>