我需要使用用户名和密码对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;
}
}
答案 0 :(得分:0)
在服务器部分,您可以使用passwordCallbackRef而不是passwordCallbackClass来提供实例。我不知道客户是否可以使用属性,因为文档不太好
在ws-config上尝试此操作并在clientpasswordcallback singleton中提供密码
<cxf:property key="passwordCallbackRef">
<ref bean="myPasswordCallback"/>
</cxf:property>
<bean id="myPasswordCallback"
class="com.mycompany.ClientPasswordCallback"/>