首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Apache CXF的WS-Security UsernameToken

使用Apache CXF的WS-Security UsernameToken
EN

Stack Overflow用户
提问于 2014-10-28 10:30:09
回答 2查看 18.4K关注 0票数 7

我有一个与SOAP服务交互的java应用程序。我使用WSDL通过CXF生成了一个java客户端,但我需要使用ws-security对我的调用进行身份验证。我正在寻找一种仅限代码的方法来实现这一点,并且我没有任何xml配置。这是我尝试过的:

代码语言:javascript
复制
Map ctx = ((BindingProvider)port).getRequestContext();
ctx.put("ws-security.username", "joe");
ctx.put("ws-security.password", "joespassword");
port.makeSoapCall();

但是对于无效的WS-Security头,我得到了一个解析错误。这样做的正确方法是什么?

在SOAP UI中,我可以通过右键单击soap标头,单击"Add WSS UsernameToken",然后选择"Password Text“来轻松地完成此操作。

EN

回答 2

Stack Overflow用户

发布于 2014-10-30 09:15:11

您正在按照您共享的代码使用WS-SecurityPolicy。如果只使用WS-Security并使用WSS4JOutInterceptor发送用户名令牌呢?

查看apache cfx ws-security guide中的“通过API添加拦截器”部分:http://cxf.apache.org/docs/ws-security.html

根据上面的apache cxf文档,这就是需要做的事情。您可能只需要输出拦截器路径。

在客户端,您可以使用ClientProxy助手获取对CXF端点的引用:

代码语言:javascript
复制
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();

现在可以添加拦截器了:

代码语言:javascript
复制
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);

您需要在上面的示例中编写密码回调类(UTPasswordCallback)。

Apache cxf在这里有一个完整的UserName令牌示例:http://svn.apache.org/repos/asf/cxf/trunk/distribution/src/main/release/samples/ws_security/ut/

从上面的链接浏览到客户端文件夹(src/main/java/demo/wssec/ client ),查找用户名、令牌和UTPasswordCallback代码。

编辑:如果您的wsdl期望密码为纯文本,那么只需从代码中删除这一行: outProps.put("passwordType","PasswordDigest");

票数 7
EN

Stack Overflow用户

发布于 2014-10-29 22:18:34

您可以查看CXF附带的“ws- UsernameToken /ut”演示,它展示了如何以编程方式添加安全性。以下是客户端代码:

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

科尔姆。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26599983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档