【问题标题】:Avoid using CallbackHandler with cxf ws-security and spring避免将 CallbackHandler 与 cxf ws-security 和 spring 一起使用
【发布时间】:2015-05-13 03:23:13
【问题描述】:

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

【问题讨论】:

    标签: java cxf ws-security


    【解决方案1】:

    创建一个处理程序类:

    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>
    

    【讨论】:

      【解决方案2】:

      使用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> 
      

      【讨论】:

      • passwordCallbackRef
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 2011-01-15
      相关资源
      最近更新 更多