使用抢先式基本身份验证发送SOAP请求

时间:2016-04-08 08:22:51

标签: spring spring-integration basic-authentication webservice-client webservicetemplate

我正在尝试使用Spring WebServiceTemplate发出SOAP服务请求但是我总是收到错误。

当我使用SOAP UI时,相同的请求会给出成功的响应。我在SOAP UI中做的唯一不同的是,我选择一个单选按钮"先发制人地认证"

以下是我的WebServiceTemplate和客户端的COde代码段。

@Bean(name = "xxxxxWSTemplate")
public WebServiceTemplate xxxxxWSTemplate() throws Exception {
    final WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
    webServiceTemplate.setDefaultUri(env.getProperty("integration.webservice.url"));
    final Jaxb2Marshaller marshaller = new org.springframework.oxm.jaxb.Jaxb2Marshaller();
    marshaller.setContextPath(ObjectFactory.class.getPackage().getName());
    webServiceTemplate.setMarshaller(marshaller);
    webServiceTemplate.setUnmarshaller(marshaller);

    String userName = env.getProperty("integration.service.xxx.username");
    String password = env.getProperty("integration.service.xxx.password");

    Wss4jSecurityInterceptor wss4jSecurityInterceptor = new Wss4jSecurityInterceptor();
    wss4jSecurityInterceptor.setSecurementUsername(userName);
    wss4jSecurityInterceptor.setSecurementPassword(password);
    wss4jSecurityInterceptor.setSecurementMustUnderstand(true);
    wss4jSecurityInterceptor.setSecurementActions("UsernameToken");
    wss4jSecurityInterceptor.setSecurementPasswordType("PasswordText");
    wss4jSecurityInterceptor.afterPropertiesSet();

    webServiceTemplate.setInterceptors(new ClientInterceptor[] {wss4jSecurityInterceptor});

    return webServiceTemplate;
}

我总是得到" 500-Internal Server Error"从我的代码,然而相同的请求从SOAP-UI运行。

1 个答案:

答案 0 :(得分:0)

实际上“先发制人验证”是HTTP客户端的一部分,它完全与SOAP无关。

我认为你的问题只是“基本授权”。

我建议您查看HttpComponentsMessageSender

* {@code WebServiceMessageSender} implementation that uses <a href="http://hc.apache.org/httpcomponents-client">Apache
 * HttpClient</a> to execute POST requests.
 *
 * <p>Allows to use a pre-configured HttpClient instance, potentially with authentication, HTTP connection pooling, etc.
 * Authentication can also be set by injecting a {@link Credentials} instance (such as the {@link
 * UsernamePasswordCredentials}).

还要研究Apache Commons HTTP Client中的HTTP Authentication,例如关于你的“先发制人”:

  

HttpClient不支持开箱即用的抢先身份验证,因为如果误用或使用不当,抢先身份验证可能会导致严重的安全问题,例如以明文形式向未经授权的第三方发送用户凭据。因此,期望用户在其特定应用环境的背景下评估抢先认证与安全风险的潜在好处。

Spring Integration的角度来看,无所事事,BTW ......