避免使用带有cxf ws-security和spring的CallbackHandler

时间:2015-03-11 11:03:43

标签: java cxf ws-security

我在使用@Component定义的spring bean中。 我已经从属性文件中注入了@Value注释的userName和password变量。 我使用cfx自动生成的java代码调用web服务。 不幸的是,这个web服务现在使用ws-security,所以我必须使用CallbackHandler提供密码。 现在cxf直接调用这个java类而不使用spring,所以如何为该类提供正确的密码? 为什么我只能直接提供userName,我必须使用回调处理程序来提供密码? 为什么网络服务总是如此血腥过度? 有一个简单的解决方案吗?

2 个答案:

答案 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>
相关问题