"先发制人" Spring-WS客户端的基本身份验证

时间:2014-07-08 15:48:04

标签: spring-ws

尝试使用Spring-WS构建一个简单的Web服务客户端并且正在进行攻击。我试图调用的SOAP服务使用HTTP基本身份验证来保证安全。

使用Spring-WS教程示例,我已将WebServiceTemplate配置为使用我提供的凭据使用HttpComponentsMessageSender

<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
    <constructor-arg ref="messageFactory"/>
    <property name="messageSender">
        <bean class="org.springframework.ws.transport.http.HttpComponentsMessageSender">
            <property name="credentials">
                <bean class="org.apache.http.auth.UsernamePasswordCredentials">
                    <constructor-arg value="john:secret"/>
                </bean>
            </property>
        </bean>
    </property>
    <property name="defaultUri" value="http://example.com/WebService"/>
</bean>

当我尝试执行客户端时,出现以下错误:

org.springframework.ws.client.WebServiceTransportException: Authorization Required [401]

我以前的(WebServiceTemplate with Basic Auth using HttpComponentsMessageSenderHttpClientBuilder basic auth)搜索表明问题是Spring-WS首先尝试连接到端点而没有凭据,这导致了终止拒绝初始连接。

对于仍使用HTTP基本身份验证的Web服务,这似乎是一个非常常见的问题。

我的问题是如何让Spring在初始连接尝试时显示凭据?

我想避免为看似微不足道的事情重新实现整个框架。

(作为参考,端点是我无法控制的内部Web服务,并且没有其他选项可以使用HTTP基本身份验证,无论人们如何认为它已经失效或不安全是)。

谢谢!

1 个答案:

答案 0 :(得分:1)

我假设您已经创建了一个扩展WebServiceGatewaySupport的客户端。在这种情况下,在Configuration类中定义客户端时,将MessageSender设置在那里。必须使用凭据配置MessageSender。

@Bean
public ValidateCustomerClient customerClient(Jaxb2Marshaller marshaller, WebServiceMessageSender messageSender){
    ValidateCustomerClient client = new ValidateCustomerClient();
    client.setDefaultUri(DEFAULT_URI);
    client.setMarshaller(marshaller);
    client.setUnmarshaller(marshaller);
    client.setMessageSender(messageSender);//set MessageSender here instead on WebServiceTemplate
    return client;
}

我发现在调用客户端时,在WebServiceTemplate上设置带有凭据的MessageSender不会保留凭据,从而导致401.

虽然这个解决方案适用于我们的案例,但我欢迎任何反馈。

相关问题