2015-03-11 5 views
1

Я нахожусь в фасоли весны, определенной с помощью @Component. У меня уже есть переменные userName и password, в которые добавлена ​​аннотация @Value из файла свойств. Я вызываю webservice, используя cfx autogenerated java code. К сожалению, этот веб-сервис теперь использует ws-security, поэтому я должен предоставить пароль с помощью CallbackHandler. Теперь cxf вызывает этот класс java напрямую, не используя весну, и поэтому как я могу предоставить правильный пароль этому классу ??? Почему я могу предоставить только имя пользователя напрямую, и я должен использовать обработчик обратного вызова для предоставления пароля? Почему веб-сервисы всегда настолько кровавые, что они перегружены? Есть ли простое решение?Избегайте использования CallbackHandler с cxf ws-security и весной

ответ

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> 
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> 
+0

<идентификатор = класс компонента "cpCallbackInterceptor" = "org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor"> \t \t <Конструктор-Arg> \t \t \t \t \t \t \t < ввод ключа = "действие" значение = "UsernameToken" /> \t \t \t \t <ввод ключа = "пользователь" значение = "пользователь" /> \t \t \t \t <ввод ключа = "passwordType" значение = "PasswordText" /> \t \t \t \t passwordCallbackRef <исх боб = "clientPasswordCallback" /> \t \t \t \t \t \t –