来自 Java 的肥皂中的 UserNameToken

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1372466/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-29 16:17:36  来源:igfitidea点击:

UserNameToken in soap from Java

javaxmlsoapws-securityusernametoken

提问by Yusuf

I am trying to use a gSoap-generated wsdl from Netbeans. The webservice requires that the UserNameToken be passed in. When I use the wsdl from SoapUI (which works), it sends this:

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

However, when I try it from Netbeans using a handler (referred to by How do I add a SOAP Header using Java JAX-WS) like this:

但是,当我使用处理程序从 Netbeans 尝试它时(参见How do I add a SOAP Header using Java JAX-WS),如下所示:

            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);

it generates the soap headers like this:

它生成这样的肥皂头:

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

which causes the webservice to reply with an authentication error.

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

My questions are therefore:

因此,我的问题是:

  1. How do I generate the UserNameToken in the correct way (as SoapUi does)?
  2. Is it better to do it using a handler, or an external WSSE library like Apache WSS4J (can someone show me some sample code for this)
  1. 如何以正确的方式生成 UserNameToken(就像 SoapUi 那样)?
  2. 使用处理程序或外部 WSSE 库(如 Apache WSS4J)是否更好(有人可以向我展示一些示例代码)

回答by Yusuf

I eventually successfully used wss4j, and did something like this:

我最终成功地使用了 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 had some nested dependencies, so watch out for that.

wss4j 有一些嵌套的依赖项,所以要注意这一点。