将 UsernameToken (WS-Security-Header) 添加到 SOAP 消息
Adding a UsernameToken (WS-Security-Header) to a SOAP message
我正在尝试连接到现有的 SOAP Web 服务。我已经给出了一个 wsdl,并通过 Apache Axis2 XMLBeans 从中创建了 Java 类。
但现在我必须使用 WS-Security-Header 扩展我的 self-written 客户端发送的消息。我该怎么做?
我已经为此找到了 Apache Rampart 项目,但找不到任何解决方案来扩展从我的 Java 类 创建的带有这样 header 的消息。我只能找到机会为服务建立 WS 安全性(在 webapp 文件夹中等等)。
我很高兴看到你的回答!
感谢您的帮助!
我解决了我的问题。我想与您分享我的解决方案,希望有人需要它!
正如我上面所说,我已经使用 Apache Axis2 XMLBeans (http://axis.apache.org/axis2/java/core/docs/quickstartguide.html#clientxmlbeans).
从 wsdl 文件中创建了 Java classes
之后,我需要添加一个 WS Security Header,应该如下所示:
<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>
我以编程方式解决了这个问题:
存根中有 SOAP-method(一个没有回调处理程序,一个有回调处理程序),您要调用它来使用 Web 服务。在此方法中存在一个名为 _messageContext
的变量。这是您可以从以下位置访问 header 的地方:_messageContext.getEnvelope().getHeader()
returns SOAPHeader 实例。在这个实例中,我从 class HeaderAddery
:
调用 addSecurityToHeader
方法
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);
}
}
这样验证就成功了,我再也没有 reject-responses 了。
如果您对此有任何疑问,请告诉我!
亲切的问候!
我正在尝试连接到现有的 SOAP Web 服务。我已经给出了一个 wsdl,并通过 Apache Axis2 XMLBeans 从中创建了 Java 类。
但现在我必须使用 WS-Security-Header 扩展我的 self-written 客户端发送的消息。我该怎么做?
我已经为此找到了 Apache Rampart 项目,但找不到任何解决方案来扩展从我的 Java 类 创建的带有这样 header 的消息。我只能找到机会为服务建立 WS 安全性(在 webapp 文件夹中等等)。
我很高兴看到你的回答!
感谢您的帮助!
我解决了我的问题。我想与您分享我的解决方案,希望有人需要它!
正如我上面所说,我已经使用 Apache Axis2 XMLBeans (http://axis.apache.org/axis2/java/core/docs/quickstartguide.html#clientxmlbeans).
从 wsdl 文件中创建了 Java classes之后,我需要添加一个 WS Security Header,应该如下所示:
<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>
我以编程方式解决了这个问题:
存根中有 SOAP-method(一个没有回调处理程序,一个有回调处理程序),您要调用它来使用 Web 服务。在此方法中存在一个名为 _messageContext
的变量。这是您可以从以下位置访问 header 的地方:_messageContext.getEnvelope().getHeader()
returns SOAPHeader 实例。在这个实例中,我从 class HeaderAddery
:
addSecurityToHeader
方法
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);
}
}
这样验证就成功了,我再也没有 reject-responses 了。
如果您对此有任何疑问,请告诉我!
亲切的问候!