SOAP-WS安全头认证

时间:2015-10-02 10:41:04

标签: java soap soapui ws-security soapheader

我使用spring + XSD + Payload开发了一个web服务。我需要使用SOAPUI中的SOAP请求标头中的用户名和密码来验证请求标头 我能够在请求中生成以下标题    < soapenv:Envelope xmlns:jaxb =" http://jaxb.miws.sg.com/"的xmlns:soapenv =" HTTP://schemas.xmlsoap.org/soap/envelope/">    < soapenv:页眉和GT;    < 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:用户名>用户< /的wsse:用户名>    < wsse:密码类型=" http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"> test&lt ; /的wsse:密码>    < 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:创建> 2015-10-02T10:05:55.750Z< / WSU:创建>    < /的wsse:UsernameToken的>    < /的wsse:安全和GT;    < / soapenv:抬头> 现在我想验证userName和Password的标题元素。 例如: 情况1:    userName = User和Password = test //传递身份验证并给出响应成功 案例2:    userName = User1和Password = test1 //身份验证失败并给出响应失败 请帮我提供合适的样品来实现同样的效果。

2 个答案:

答案 0 :(得分:0)

SOAP Web服务中的处理程序(类似于拦截器/过滤器)可用于服务器端的身份验证目的,然后进一步链接请求。 请查看SOAPHandler以解析有效负载中的标头信息并验证用户名/密码。 SOAP Handler at Server Side

答案 1 :(得分:0)

以下是执行此操作的一些步骤:

  1. 通过编写自定义SOAPHandler方法实现handleMessage类。
  2. handleMessage方法中,评估上下文的MESSAGE_OUTBOUND_PROPERTY。如果它为假(意味着它是入站消息),则编写内省context.getMessage()的代码。在那里,您可以评估MIME标头,安全标头和安全标题。令牌和正文,以确定您是否需要拒绝身份验证凭据。如果您这样做,请在方法结束时返回false
  3. 将您创建的SoapHander添加到服务的处理程序链。
  4. 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)
      {
    }
    

    这是您需要添加到服务的handlerChain的SOAPHandler的初始模板:

    @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