Я использую Spring-WS для клиента, пытаясь обновить его до последней версии. Несмотря на то, что новый Wss4jSecurityInterceptor настроен не проверять входящий заголовок безопасности, он выдает исключение Wss4jSecurityValidationException ("Заголовок WS-Security не найден").
<bean id="wsSecurityInterceptor" class="org.springframework.ws.soap.security.wss4j2.Wss4jSecurityInterceptor">
<property name="securementActions" value="UsernameToken"/>
<property name="validationActions" value="NoSecurity"/>
<property name="securementPasswordType" value="PasswordText"/>
<property name="securementUsernameTokenElements" value="Nonce"/>
</bean>
На мой взгляд, это связано с тем, что Spring-WS 2.3.0 и WSS4J 2.1.4 на данный момент несовместимы.
Wss4jSecurityInterceptor заполняет поле validationActionsVector следующим образом:
public void setValidationActions(String actions) {
this.validationActions = actions;
try {
validationActionsVector = WSSecurityUtil.decodeAction(actions);
}
catch (WSSecurityException ex) {
throw new IllegalArgumentException(ex);
}
}
где WSS4J в случае NoSecurity возвращает в WSSecurityUtil пустой список:
public static List<Integer> decodeAction(String action) throws WSSecurityException {
String actionToParse = action;
if (actionToParse == null) {
return Collections.emptyList();
}
actionToParse = actionToParse.trim();
if ("".equals(actionToParse)) {
return Collections.emptyList();
}
List<Integer> actions = new ArrayList<>();
String single[] = actionToParse.split("\\s");
for (int i = 0; i < single.length; i++) {
if (single[i].equals(WSHandlerConstants.NO_SECURITY)) {
return actions;
} else if ...
Но Wss4jSecurityInterceptor проверяет NoSecurity-Item в списке:
@Override
protected void validateMessage(SoapMessage soapMessage, MessageContext messageContext)
throws WsSecurityValidationException {
if (logger.isDebugEnabled()) {
logger.debug("Validating message [" + soapMessage + "] with actions [" + validationActions + "]");
}
if (validationActionsVector.contains(WSConstants.NO_SECURITY)) {
return;
} ...
Это известная проблема? Существует ли обходной путь? Или мне нужно переопределить метод в WSS4J, чтобы заполнить список ожидаемым элементом?
wss4j2
классы наwss4j
: они устарели, но на самом деле работают - person EliuX   schedule 02.01.2017