向 wsdl2java 生成的代码添加soap头认证

Posted

技术标签:

【中文标题】向 wsdl2java 生成的代码添加soap头认证【英文标题】:Adding soap header authentication to wsdl2java generated code 【发布时间】:2014-03-17 06:47:51 【问题描述】:

我正在从 wsdl 创建 Java Web 服务客户端。我使用 Eclipses 的动态 Web 项目和新的 Web 服务客户端来生成带有 Apache Axis 1.4 的 wsdl2java 代码。我需要向此代码添加 SOAP 身份验证,以便它与服务一起使用。我在生成的代码中找不到这样做的地方。经过大量研究,我发现了这个,到目前为止,我一直将它用作我的代码的主干。

Adding ws-security to wsdl2java generated classes

在我收到“处理邮件安全性时发生错误”或类似内容之前。现在我得到了

“异常:不理解“MustUnderstand”标头:http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd安全消息:null”

我已经尝试了很多方法来克服这个异常。这是我现在得到的代码。

javax.xml.namespace.QName headerName = new javax.xml.namespace.QName(
                "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "Security");
        org.apache.axis.message.SOAPHeaderElement header = new org.apache.axis.message.SOAPHeaderElement(headerName);
        header.setActor(null);
        header.setMustUnderstand(true);

        // Add the UsernameToken element to the WS-Security header
        javax.xml.soap.SOAPElement utElem = header.addChildElement("UsernameToken");
        utElem.setAttribute("Id", "uuid-3453f017-d595-4a5b-bc16-da53e5831cd1-1");
        javax.xml.soap.SOAPElement userNameElem = utElem.addChildElement("Username");
        userNameElem.setValue("username");
        javax.xml.soap.SOAPElement passwordElem = utElem.addChildElement("Password");
        passwordElem.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
        passwordElem.setValue("password");

        header.setProcessed(true);

        // Finally, attach the header to the binding.
        setHeader(header)

此代码位于我的 Binding_ServiceStub 类中(在它的 createCall 方法中)。

我们已经使用这个 wsdl 在 C# 和 VB 中创建了客户端,并且只需更改 ClientCredentials 变量即可,该变量是生成的代理类的扩展。我希望这里有类似的东西。

这也是来自 wsdl 代码的安全策略。

<wsp:Policy><sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient"><wsp:Policy><sp:WssUsernameToken10/></wsp:Policy></sp:UsernameToken></wsp:Policy>

有人知道我还能在这里做什么吗?为什么会发生这种异常?我尝试了许多不同的前缀和 setProcesses 和 setMustUnderstand 值组合,但都是徒劳的(并且基于我对这个异常的研究)。

如果有人知道将 Soap 标头身份验证添加到 wsdl2java 代码的方法,我也会接受。只需要这个工作,你会认为这样的事情会更简单一点,或者至少有更多的例子。

更新- 确认使用 SOAPUI 传递的相同标头工作正常。一定是框架的东西?我创建了一个自定义处理程序来处理 SOAP 消息,但这没有帮助。 Axis 1.4 和 JAX-RPC 是问题吗? (我知道它们已经过时但仍然......)

【问题讨论】:

【参考方案1】:

酷。我决定只使用 Apache CXF 作为我的框架,使用它就像添加一样简单

javax.xml.ws.BindingProvider bp = (javax.xml.ws.BindingProvider) port;
    bp.getRequestContext().put("ws-security.username", username);
    bp.getRequestContext().put("ws-security.password", password);

哇,好多了。不要使用 Axis 1.4 的经验教训。

【讨论】:

以上是关于向 wsdl2java 生成的代码添加soap头认证的主要内容,如果未能解决你的问题,请参考以下文章

apache CXF wsdl2java工具的使用

如何在Apache Axis Web Service(SOAP)中添加基本身份验证?

将 ws-security 添加到 wsdl2java 生成的类

注释CXF(wsdl2java)生成的包

怎么用cxf的wsdl2java解析wcf生成的wsdl

Scala 相当于 wsdl2java?