【问题标题】:UserNameToken in soap from Java来自 Java 的肥皂中的 UserNameToken
【发布时间】:2009-09-03 09:48:32
【问题描述】:

我正在尝试使用来自 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>

但是,当我使用像这样的处理程序(由 How do I add a SOAP Header using Java JAX-WS 引用)从 Netbeans 尝试它时:

            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标头:

    <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. 如何以正确的方式生成 UserNameToken(如 SoapUi 那样)?
  2. 是使用处理程序还是使用 Apache WSS4J 等外部 WSSE 库更好(谁能给我一些示例代码)

【问题讨论】:

    标签: java xml soap ws-security usernametoken


    【解决方案1】:

    我最终成功使用了 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 有一些嵌套的依赖关系,所以要小心。

    【讨论】:

    • 很好的例子。感谢您为我节省了很多时间!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多