将 UsernameToken (WS-Security-Header) 添加到 SOAP 消息

mrb*_*ela 2 java ws-security soap axis2 rampart

我正在尝试连接到现有的 SOAP Web 服务。我提供了一个 wsdl,从中我通过 Apache Axis2 XMLBeans 创建了 Java 类。

但是现在我必须使用 WS-Security-Header 扩展我自己编写的客户端发送的消息。我怎样才能做到这一点?

我为此找到了 Apache Rampart 项目,但找不到任何解决方案来扩展从我的 Java 类创建的消息,并使用此类标头。我只能找到为服务建立 WS 安全性的机会(在 webapp 文件夹等中)。

我对你的回答感到兴奋!

感谢您的帮助!

mrb*_*ela 7

我解决了我的问题。我想与您分享我的解决方案,希望任何人都需要它!

正如我上面所说,我已经使用 Apache Axis2 XMLBeans ( http://axis.apache.org/axis2/java/core/docs/quickstartguide.html#clientxmlbeans )从 wsdl 文件中创建了 Java 类。

之后,我需要添加一个 WS 安全标头,它应该如下所示:

<wsse:Security soap:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
    <wsse:UsernameToken wsu:Id="UsernameToken-1" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
        <wsse:Username><YOUR USERNAME></wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"><YOUR PASSWORD></wsse:Password>
    </wsse:UsernameToken>
</wsse:Security> 
Run Code Online (Sandbox Code Playgroud)

我以编程方式解决了这个问题:

在存根中有 SOAP 方法(一种没有回调处理程序,一种带有 callbackHandler),您希望调用它来使用 Web 服务。在此方法中包含一个名为 的变量_messageContext。您可以从此处访问标头:_messageContext.getEnvelope().getHeader()返回 SOAPHeader 实例。通过这个实例,我addSecurityToHeader从类中调用方法HeaderAddery

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;

public class HeaderAdder {

    public static void addSecurityToHeader(
            org.apache.axiom.soap.SOAPHeader header) {

        OMFactory factory = OMAbstractFactory.getOMFactory();

        OMNamespace namespaceWSSE = factory
                .createOMNamespace(
                        "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
                        "wsse");

        OMElement element = factory.createOMElement("Security", namespaceWSSE);

        OMAttribute attribute = factory.createOMAttribute("mustUnderstand",
                null, "1");

        element.addAttribute(attribute);

        header.addChild(element);

        OMElement element2 = factory.createOMElement("UsernameToken",
                namespaceWSSE);

        OMNamespace namespaceWSU = factory
                .createOMNamespace(
                        "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd",
                        "wsu");

        attribute = factory.createOMAttribute("Id", namespaceWSU,
                "UsernameToken-1");

        element2.addAttribute(attribute);

        element.addChild(element2);

        OMElement element3 = factory.createOMElement("Username", namespaceWSSE);

        element3.setText("<YOUR USERNAME>");

        OMElement element4 = factory.createOMElement("Password", namespaceWSSE);

        attribute = factory
                .createOMAttribute(
                        "Type",
                        null,
                        "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");

        element4.setText("<YOUR PASSWORD>");

        element2.addChild(element3);
        element2.addChild(element4);
    }
}
Run Code Online (Sandbox Code Playgroud)

有了这个,认证工作了,我再也没有拒绝回应了。

如果您对此有任何疑问,请告诉我!

亲切的问候!