2015-10-02 187 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