我正在使用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/UsernameToken
和SOAPHeader
值。但是,我更愿意添加一个现有SOAPHandler
来创建整个安全部分,或者为UsernameTokenInterceptor
提供供应商功能。
答案 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();
}
因此,您可以将其放入方法中并传递用户名和密码,因此您可以随时更改它。