【问题标题】:ws-security - set different username and password in every requestws-security - 在每个请求中设置不同的用户名和密码
【发布时间】:2017-03-21 15:17:26
【问题描述】:

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

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

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

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

作为解决方法,我实现了一个SOAPHandler&lt;SOAPMessageContext&gt;,它修改了SOAPHeaderSecurity/UsernameToken 部分中的UsernamePassword 值。但是,我更愿意添加一个现有的SOAPHandler 来创建整个安全部分,或者为UsernameTokenInterceptor 提供一个供应商功能。

【问题讨论】:

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


    【解决方案1】:

    为什么需要 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(); 
    }
    

    所以你可以把它放在一个方法中并传递用户名和密码,因此你可以随时更改它。

    【讨论】:

      猜你喜欢
      • 2020-07-26
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 2018-05-01
      • 2016-06-12
      • 2012-07-11
      • 1970-01-01
      • 2012-09-01
      相关资源
      最近更新 更多