Я нахожусь в фасоли весны, определенной с помощью @Component. У меня уже есть переменные userName и password, в которые добавлена аннотация @Value из файла свойств. Я вызываю webservice, используя cfx autogenerated java code. К сожалению, этот веб-сервис теперь использует ws-security, поэтому я должен предоставить пароль с помощью CallbackHandler. Теперь cxf вызывает этот класс java напрямую, не используя весну, и поэтому как я могу предоставить правильный пароль этому классу ??? Почему я могу предоставить только имя пользователя напрямую, и я должен использовать обработчик обратного вызова для предоставления пароля? Почему веб-сервисы всегда настолько кровавые, что они перегружены? Есть ли простое решение?Избегайте использования CallbackHandler с cxf ws-security и весной
1
A
ответ
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>
<идентификатор = класс компонента "cpCallbackInterceptor" = "org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor"> \t \t <Конструктор-Arg> \t \t \t \t \t constructor-arg> \t –