Я использую Spring-WS для клиента, чтобы попробовать обновить его до последней версии. Несмотря на то, что новый Wss4jSecurityInterceptor настроен не на проверку входящего заголовка безопасности, он вызывает Wss4jSecurityValidationException («Нет заголовка WS-Security»).Spring-WS 2.3.0 Проверка заголовка безопасности с WSS4J 2.1.4 - NoSecurity не будет работать
<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>
На мой взгляд, это потому, что весна-WS 2.3.0 и 2.1.4 WSS4J несовместимы в этой точке.
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;
} ...
Is это известная проблема? Существует ли обходное решение? Или мне нужно переопределить метод в WSS4J, чтобы заполнить список ожидаемым элементом?
Заменить' классы wss4j2' для 'wss4j' : они устарели, но фактически работают – EliuX