2015-10-02 181 views
1

我开发了一个使用spring + XSD + Payload的webservices。我有用户名和密码SOAP请求头来认证所述请求报头的要求我与SOAPUI实现SOAP-WS安全头认证

我米能够产生在请求

<soapenv:Envelope xmlns:jaxb="http://jaxb.miws.sg.com/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Header> 
    <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis- 200401-wss-wssecurity-secext-1.0.xsd" 
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
    <wsse:UsernameToken wsu:Id="UsernameToken-C3092BFBAE5B212E93144378035575013"> 
    <wsse:Username>User</wsse:Username> 
    <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">test</wsse:Password> 
    <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">CT1Fyo/g2WMaadE52bsnkg==   </wsse:Nonce> 
    <wsu:Created>2015-10-02T10:05:55.750Z</wsu:Created> 
    </wsse:UsernameToken> 
    </wsse:Security> 
    </soapenv:Header> 

现在我要验证的下面标头用户名和密码的标题元素。

例:

情况1: 的userName =用户和密码=测试//验证通过,给响应成功

情况2: 的userName = User1和密码= TEST1 //认证失败,并给响应失败

请帮我提供合适的样品来达到同样效果。

回答

0

SOAP webservices中的处理程序(与Interceptors/Filters类似)可用于服务器端的身份验证,然后进一步链接请求。 请看看SOAPHandler来解析来自有效负载的头信息并验证用户名/密码。 SOAP Handler at Server Side

0

这里有一些步骤做:

  1. 通过编写自定义handleMessage方法实现一个SOAPHandler类。
  2. handleMessage方法中,评估上下文的MESSAGE_OUTBOUND_PROPERTY。如果它是假的(意味着它是入站消息),那么编写反映context.getMessage()的代码。您可以评估MIME头文件,安全头文件标记和主体,以确定是否需要拒绝认证凭证。如果这样做,则在方法结束时返回false
  3. 将您创建的SoapHander添加到服务的处理程序链中。一种SOAPHandler的

例子:

public class MyCustomSoapHandler implements SOAPHandler<SOAPMessageContext> 
{ 
    public Set<QName> getHeaders() 
    { 
    return Collections.emptySet(); 
    } 

    public boolean handleMessage(SOAPMessageContext messageContext) 
    { 
    Boolean outboundProperty = (Boolean) 
     messageContext.get (MessageContext.MESSAGE_OUTBOUND_PROPERTY); 

    if (outboundProperty.booleanValue()) { 
     //This is for handling messages going out of the conduit 
    } else { 
     //Here is where you want to authenticate 
    } 

    return true; //return false if do not want to proceed to the next handler in the chain 
    } 

    public boolean handleFault(SOAPMessageContext messageContext) 
    { 
    return true; 
    } 
    public void close(MessageContext messageContext) 
    { 
} 

这里您SOAPHandler首发模板,你需要添加到您的服务的HandlerChain的:

@WebService(name = "Handler", targetNamespace = "http://example.org") 
@HandlerChain(file="handler-chain.xml") 
public class HandlerWS 
{ 
    @Resource 
    WebServiceContext ctx; 
    @WebMethod() 
    public String getProperty(String propertyName) 
    { 
    return (String) ctx.getMessageContext().get(propertyName); 
    } 
} 

你还需要添加handler-chain.xml到类路径:

examples.webservices.handler.Handler1 examples.webservices.handler。Handler2

对于一个完整的指南,请参阅Oracle's guide to creating SOAPHandlers