简体   繁体   English

使用Apache CXF的WS-Security UsernameToken

[英]WS-Security UsernameToken with Apache CXF

I have a java application that interacts with a SOAP service. 我有一个与SOAP服务交互的java应用程序。 I used the WSDL to generate a java client via CXF, but I need to authenticate my calls using ws-security. 我使用WSDL通过CXF生成一个java客户端,但我需要使用ws-security验证我的调用。 I am looking for a code-only way to do this, and I don't have any xml configurations. 我正在寻找一种仅使用代码的方法,我没有任何xml配置。 This is what I have tried: 这是我尝试过的:

Map ctx = ((BindingProvider)port).getRequestContext();
ctx.put("ws-security.username", "joe");
ctx.put("ws-security.password", "joespassword");
port.makeSoapCall();

But I get a parse error for invalid WS-Security header. 但是我收到无效WS-Security标头的解析错误。 What is the right way to do this? 这样做的正确方法是什么?

In SOAP UI, I can do this easily by right-clicking the soap header, clicking "Add WSS UsernameToken", and selecting "Password Text" 在SOAP UI中,我可以通过右键单击soap标题,单击“Add WSS UsernameToken”,然后选择“Password Text”来轻松完成此操作。

You are using WS-SecurityPolicy as per the code you shared. 您根据共享的代码使用WS-SecurityPolicy。 How about using WS-Security only and sending across the usernametoken using WSS4JOutInterceptor? 如何仅使用WS-Security并使用WSS4JOutInterceptor通过usernametoken发送?

Check the section " Adding the interceptors via the API " in apache cfx ws-security guide here : http://cxf.apache.org/docs/ws-security.html 请查看apache cfx ws-security指南中的“ 通过API添加拦截器 ”部分: http//cxf.apache.org/docs/ws-security.html

This is what needs to be done as per the above apache cxf documenation above. 这是根据上面的上述apache cxf文档需要完成的工作。 You might only need the out interceptor path. 您可能只需要out拦截器路径。

On the client side, you can obtain a reference to the CXF endpoint using the ClientProxy helper: 在客户端,您可以使用ClientProxy帮助程序获取对CXF端点的引用:

import org.apache.cxf.frontend.ClientProxy;
...

GreeterService gs = new GreeterService();
Greeter greeter = gs.getGreeterPort();
...
org.apache.cxf.endpoint.Client client = ClientProxy.getClient(greeter);
org.apache.cxf.endpoint.Endpoint cxfEndpoint = client.getEndpoint();

Now you're ready to add the interceptors: 现在您已准备好添加拦截器:

import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor;
import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
...

Map<String,Object> inProps = new HashMap<String,Object>();
... // how to configure the properties is outlined below;

WSS4JInInterceptor wssIn = new WSS4JInInterceptor(inProps);
cxfEndpoint.getInInterceptors().add(wssIn);

Map<String,Object> outProps = new HashMap<String,Object>();
outProps.put("action", "UsernameToken Timestamp");
outProps.put("passwordType", "PasswordDigest"); //remove this line if want to use plain text password
outProps.put("user", "abcd");
outProps.put("passwordCallbackClass", "demo.wssec.client.UTPasswordCallback");

WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
cxfEndpoint.getOutInterceptors().add(wssOut);

You will need to write password callback class (UTPasswordCallback) in the example above. 您将需要在上面的示例中编写密码回调类(UTPasswordCallback)。

Apache cxf has a complete sample for UserName token here: http://svn.apache.org/repos/asf/cxf/trunk/distribution/src/main/release/samples/ws_security/ut/ Apache cxf在此处有一个完整的UserName令牌示例: http//svn.apache.org/repos/asf/cxf/trunk/distribution/src/main/release/samples/ws_security/ut/

From the above link browse to client folder (src/main/java/demo/wssec/client) for user name token and UTPasswordCallback code. 从上面的链接浏览到客户端文件夹(src / main / java / demo / wssec / client)以获取用户名令牌和UTPasswordCallback代码。

EDIT: If your wsdl expects password as plain text then just remove this line from the code: outProps.put("passwordType", "PasswordDigest"); 编辑:如果您的wsdl要求密码为纯文本,那么只需从代码中删除此行:outProps.put(“passwordType”,“PasswordDigest”);

You could take a look at the "ws-security/ut" demo that ships with CXF, this shows how to add a UsernameToken programmatically. 您可以查看CXF附带的“ws-security / ut”演示,这将演示如何以编程方式添加UsernameToken。 Here is the client code: 这是客户端代码:

https://github.com/apache/cxf/blob/master/distribution/src/main/release/samples/ws_security/ut/src/main/java/demo/wssec/client/Client.java https://github.com/apache/cxf/blob/master/distribution/src/main/release/samples/ws_security/ut/src/main/java/demo/wssec/client/Client.java

Colm. 科尔姆。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM