我在使用@Component定义的spring bean中。 我已经从属性文件中注入了@Value注释的userName和password变量。 我使用cfx自动生成的java代码调用web服务。 不幸的是,这个web服务现在使用ws-security,所以我必须使用CallbackHandler提供密码。 现在cxf直接调用这个java类而不使用spring,所以如何为该类提供正确的密码? 为什么我只能直接提供userName,我必须使用回调处理程序来提供密码? 为什么网络服务总是如此血腥过度? 有一个简单的解决方案吗?
答案 0 :(得分:1)
使用passwordCallbackRef
代替passwordCallbackClass
,将密码注入passwordCallbackRef
,如下所示。
<bean id="cpCallbackInterceptor" class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
<constructor-arg>
<map>
<entry key="action" value="UsernameToken" />
<entry key="user" value="user" />
<entry key="passwordType" value="PasswordText" />
<entry>
<key>
<value>passwordCallbackRef</value>
</key>
<ref bean="clientPasswordCallback" />
</entry>
</map>
</constructor-arg>
</bean>
<bean id="clientPasswordCallback " name="clientPasswordCallback " class="your.package.ClientPasswordCallback">
<constructor-arg index="0" type="java.lang.String" value="${password}"/>
</bean>
答案 1 :(得分:0)
创建一个处理程序类:
public class ClientPasswordCallback implements CallbackHandler {
private static String user = null;
private static String password = null;
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
if (user == null) {
// Retrieve here your values
}
pc.setIdentifier(user);
pc.setPassword(password);
}
}
将此类分配给WSS4JOutInterceptor。我在xml上定义了这个:
<bean id="wss4jOut" class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
<constructor-arg>
<map>
<entry key="action" value="UsernameToken" />
<entry key="user" value="ws-client" />
<entry key="passwordType" value="PasswordText" />
<entry key="passwordCallbackClass"
value="your.package.ClientPasswordCallback" />
</map>
</constructor-arg>
</bean>