繁体   English   中英

Java中的soap中的UserNameToken

[英]UserNameToken in soap from Java

我正在尝试使用NetBeans的gSoap生成的wsdl。 Web服务要求传入UserNameToken。当我使用SoapUI中的wsdl(有效)时,它将发送此消息:

<wsse:Username>myname</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">mypass</wsse:Password>

但是,当我从Netbeans中使用处理程序(通过使用Java JAX-WS如何添加SOAP Header进行引用)进行尝试时,如下所示:

            String prefix = "wsse";
            String uri = "http://...wsssecurity...";

            SOAPElement securityElem = factory.createElement("Security",prefix,uri);

                SOAPElement UserNametokenElem = factory.createElement("UserNameToken",prefix,uri);

                    SOAPElement UsernameElem = factory.createElement("wsse:Username");
                    UsernameElem.addTextNode("myname");
                    SOAPElement PasswordElem = factory.createElement("Password");
                    PasswordElem.addTextNode("mypass");

                    UserNametokenElem.addChildElement(UsernameElem);
                    UserNametokenElem.addChildElement(PasswordElem);

                    securityElem.addChildElement(UserNametokenElem);
            SOAPHeader header = envelope.addHeader();
            header.addChildElement(securityElem);

它生成如下的soap headers:

    <wsse:Security xmlns:wsse="http://...wsssecurity...">
    <wsse:UserNameToken xmlns:wsse="http://...wsssecurity...">
    <Username xmlns="">myname</Username>
    <Password xmlns="">mypass</Password>
    </wsse:UserNameToken>
    </wsse:Security>

这会导致Web服务以身份验证错误进行回复。

因此,我的问题是:

  1. 如何以正确的方式(如SoapUi一样)生成UserNameToken?
  2. 使用处理程序还是外部WSSE库(例如Apache WSS4J)进行处理是否更好(有人可以向我展示一些示例代码)

我最终成功使用了wss4j,并做了如下操作:

            SOAPPart soappart = message.getSOAPPart();
            SOAPEnvelope envelope = soappart.getEnvelope();
            SOAPHeader header = envelope.getHeader();
            WSSecHeader wsheader = new WSSecHeader();
            wsheader.insertSecurityHeader(soappart);
            WSSecUsernameToken token = new WSSecUsernameToken();
            token.setPasswordType(WSConstants.PASSWORD_DIGEST);
            token.setUserInfo("myuser", "mypass");
            token.build(soappart, wsheader);

wss4j有一些嵌套的依赖项,因此请当心。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM