使用Apache CXF的WS-Security UsernameToken

我有一个与SOAP服务交互的java应用程序。 我使用WSDL通过CXF生成java客户端,但我需要使用ws-securityvalidation我的调用。 我正在寻找一种仅使用代码的方法,我没有任何xml配置。 这是我尝试过的:

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”来轻松完成此操作。

您根据共享的代码使用WS-SecurityPolicy。 如何仅使用WS-Security并使用WSS4JOutInterceptor通过usernametoken发送?

请查看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 inProps = new HashMap(); ... // how to configure the properties is outlined below; WSS4JInInterceptor wssIn = new WSS4JInInterceptor(inProps); cxfEndpoint.getInInterceptors().add(wssIn); Map outProps = new HashMap(); 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”);

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

https://git-wip-us.apache.org/repos/asf?p=cxf.git;a=blob_plain;f=distribution/src/main/release/samples/ws_security/ut/src/main/java/演示/ wssec /客户/ Client.java; HB = HEAD

科尔姆。