ws-security - 在每个请求中设置不同的用户名和密码

时间:2017-03-21 15:17:26

标签: java cxf jax-ws ws-security wss4j

我正在使用Apache-CXF创建我的Web服务客户端,该客户端使用带有UsernameToken身份验证的ws-security。

为了对每个请求使用相同的凭据,我只需将以下属性添加到BindingProvider(即ws-port):

    Map<String, Object> ctx = bindingProvider.getRequestContext();
    ctx.put(SecurityConstants.USERNAME, "myUserName");
    ctx.put(SecurityConstants.PASSWORD, "myPassword");

但是,如何在每个请求中设置不同的用户和密码?是否可以向UsernameTokenInterceptor添加某种供应商功能,以便在每个线程的基础上提供凭证(例如,通过从ThreadLocal变量中读取它们)?

作为解决方法,我实施了SOAPHandler<SOAPMessageContext>,修改了Username Password部分中的Security/UsernameTokenSOAPHeader值。但是,我更愿意添加一个现有SOAPHandler来创建整个安全部分,或者为UsernameTokenInterceptor提供供应商功能。

1 个答案:

答案 0 :(得分:0)

为什么需要UsernameTokenInterceptor?只需使用cxf中生成的客户端并从中获取存根,然后修改它。

有些事情:

public yourResponse call(final String username, final String password) {
    final YourService service = new YourService();
    final YourStub stub = service.getService();

    final Map ctx = ((BindingProvider)stub).getRequestContext();

    ctx.put("ws-security.username", username);
    ctx.put("ws-security.password", password);

    return stub.callYourMethod(); 
}

因此,您可以将其放入方法中并传递用户名和密码,因此您可以随时更改它。