gpt4 book ai didi

java - 使用 Apache CXF 的 WS-Security UsernameToken

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:17:22 30 4
gpt4 key购买 nike

我有一个与 SOAP 服务交互的 Java 应用程序。我使用 WSDL 通过 CXF 生成一个 java 客户端,但我需要使用 ws-security 来验证我的调用。我正在寻找一种仅代码方式来执行此操作,并且我没有任何 xml 配置。这是我尝试过的:

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

但我收到无效 WS-Security header 的解析错误。执行此操作的正确方法是什么?

在 SOAP UI 中,我可以通过右键单击 soap header 、单击“添加 WSS UsernameToken”并选择“密码文本”来轻松完成此操作

最佳答案

您正在根据您共享的代码使用 WS-SecurityPolicy。仅使用 WS-Security 并使用 WSS4JOutInterceptor 发送用户名 token 如何?

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

根据上面的 apache cxf 文档,这是需要完成的。您可能只需要 out 拦截器路径。

在客户端,您可以使用 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();

现在您已准备好添加拦截器:

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 token 的完整示例:http://svn.apache.org/repos/asf/cxf/trunk/distribution/src/main/release/samples/ws_security/ut/

从上面的链接浏览到客户端文件夹 (src/main/java/demo/wssec/client) 以获取用户名 token 和 UTPasswordCallback 代码。

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

关于java - 使用 Apache CXF 的 WS-Security UsernameToken,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26599983/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com