2017-03-21 60 views
0

我使用Apache-CXF创建我的web服务客户端,该客户端使用ws-security进行UsernameToken验证。ws-security - 在每个请求中设置不同的用户名和密码

为了使用相同的凭据为每个请求我只是添加以下属性我BindingProvider(即WS-端口):

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

但是,我怎么可以设置不同的用户名和密码的每一个请求?是否有可能为UsernameTokenInterceptor添加某种供应商功能以基于每个线程提供证书(例如,通过从ThreadLocal变量中读取它们)?

作为解决办法我实现了一个SOAPHandler<SOAPMessageContext>修饰在SOAPHeaderSecurity/UsernameToken部分UsernamePassword值。但是,我更愿意添加创建整个安全部分的现有SOAPHandler或向UsernameTokenInterceptor提供供应商功能。

回答

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(); 
} 

所以,你可以把这个方法,并通过用户名和密码,因此您可以随时改变它。

相关问题