我正在尝试使用Spring-WS构建一个简单的Web服务客户端,并且正在进行攻击.我试图调用的SOAP服务使用HTTP基本身份验证来提高安全性.
使用Spring-WS教程示例,我已将my配置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>
Run Code Online (Sandbox Code Playgroud)
当我尝试执行客户端时,出现以下错误:
org.springframework.ws.client.WebServiceTransportException: Authorization Required [401]
我之前的(使用HttpComponentsMessageSender和HttpClientBuilder基本身份验证的基本身份验证的WebServiceTemplate)搜索表明问题是Spring-WS尝试首先连接到没有凭据的端点,这导致端点拒绝初始连接.
对于仍使用HTTP基本身份验证的Web服务,这似乎是一个非常常见的问题.
我的问题是如何让Spring在初始连接尝试中提供凭据?
我想避免为一些看似微不足道的事情重新实现整个框架.
(作为参考,端点是我无法控制的内部Web服务,并且没有其他选项可以使用HTTP基本身份验证,无论人们如何认为它是如何失效或不安全).
谢谢!
小智 2
我假设您已经创建了一个扩展 WebServiceGatewaySupport 的客户端。在这种情况下,当在配置类中定义客户端时,请在那里设置 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;
}
Run Code Online (Sandbox Code Playgroud)
我发现在 WebServiceTemplate 上设置带有凭据的 MessageSender 在调用客户端时不会保留凭据,从而导致 401。
虽然这个解决方案对我们的案例有效,但我欢迎任何反馈。
| 归档时间: |
|
| 查看次数: |
2731 次 |
| 最近记录: |