如何将动态值(凭据)传递给Mule中的CXF回调处理程序以使用SOAP服务进行身份验证

时间:2016-05-22 13:05:19

标签: java authentication soap mule cxf

我需要使用用户名和密码对SOAP服务进行身份验证。 它使用CallbackHandler for CXF将静态值传递给服务并进行身份验证。

但我需要进行身份验证,具体取决于传递到我的Mule应用程序的凭据,HTTP标头,params等。

我使用属性使其工作,但仍然是静态值,代码如下。 我正在使用名为' smarthome-test.properties'的属性文件。它具有名为fp.password和fp.username的属性,在CXF安全范围内设置了fp.username。

我如何使用调用属性,因此通常使用flowVars并使用CallbackHandler类中的那些? 那时的Mule消息没有传递给这个CallbackHandler,那么我的选择是什么,如何使它能够从flowVars中检索值,或者可以先将它们存储在某个地方,传入一个对象?

 SELECT d.*,'TRUE'
FROM dates d
WHERE EXISTS(SELECT 1 FROM closures c
             WHERE c.start <= d.datetime AND d.datetime <= c.stop)

有关CXF客户端的详细信息

package com.smarthomes.soap;

import java.io.IOException;
import java.util.ResourceBundle;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;

import org.apache.ws.security.WSPasswordCallback;

public class ClientPasswordCallback implements CallbackHandler {

    //ParseCredentials Credentials;

    static final ResourceBundle bundle = ResourceBundle.getBundle("smarthome-test");

    private String passwordPropertyName = "fp.password";

    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {

        WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
        if ("mydummyuserName".equals(pc.getIdentifier())) {
           //pc.setPassword("mydummypassWord"); 
            pc.setPassword(bundle.getString(getPasswordPropertyName()));
        }

    }
    public String getPasswordPropertyName() {
        return passwordPropertyName;
    }
    public void setPasswordPropertyName(String passwordPropertyName) {
        this.passwordPropertyName = passwordPropertyName;
    }

}

1 个答案:

答案 0 :(得分:0)

在服务器部分,您可以使用passwordCallbackRef而不是passwordCallbackClass来提供实例。我不知道客户是否可以使用属性,因为文档不太好

在ws-config上尝试此操作并在clientpasswordcallback singleton中提供密码

 <cxf:property key="passwordCallbackRef">
              <ref bean="myPasswordCallback"/>
           </cxf:property>


<bean id="myPasswordCallback"
  class="com.mycompany.ClientPasswordCallback"/>