Проверка заголовка безопасности Spring-WS 2.3.0 с помощью WSS4J 2.1.4 - NoSecurity не будет работать

Я использую 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, чтобы заполнить список ожидаемым элементом?


person S. Rohe    schedule 06.06.2016    source источник
comment
Замените wss4j2 классы на wss4j: они устарели, но на самом деле работают   -  person EliuX    schedule 02.01.2017


Ответы (4)


У меня была та же проблема — невозможно избежать проверки — но я решил ее следующим образом:

устанавливает в перехватчике значение false для validateRequest и validateResponse.

Не нужно взламывать какой-либо код или расширять какой-либо класс. Вы можете проверить связанную проблему на странице https://jira.spring.io/browse/SWS-961. .

person Javi Vazquez    schedule 16.01.2017

Я согласен, это проблема.

У меня тот же сценарий, когда мне не нужно проверять входящее сообщение.

Я переопределил метод validateMessage в своем классе приложения, который расширяет Wss4jSecurityInterceptor, и это кажется более чистым решением.

@Override protected void validateMessage(SoapMessage soapMessage, MessageContext messageContext) бросает WsSecurityValidationException {
return;
}

person springbee    schedule 18.06.2016
comment
Это не совсем ответ. - person gobrewers14; 19.06.2016
comment
@ GoBrewers14 - У вас есть лучший способ решить эту проблему? - person springbee; 19.06.2016

Я нашел обходной путь, который работает для меня. Конечно, было бы лучше исправить это в следующей версии Spring-WS.

public class MyWss4jSecurityInterceptor extends Wss4jSecurityInterceptor {

  private String validationActions;

  /**
   * Overrides the method in order to avoid a security check if the 
   * ValidationAction 'NoSecurity'is selected.
   *
   * @param messageContext
   */
  @Override
  protected void validateMessage(SoapMessage soapMessage, MessageContext messageContext)
        throws WsSecurityValidationException {
    if (!WSHandlerConstants.NO_SECURITY.equals(validationActions)) {
        super.validateMessage(soapMessage, messageContext);
    }
  }

  /**
   * @return the validationActions
   */
  public String getValidationActions() {
    return validationActions;
  }

  /**
   * @param validationActions the validationActions to set
   */
  @Override
  public void setValidationActions(String validationActions) {
    this.validationActions = validationActions;
    super.setValidationActions(validationActions);
  }
}
person S. Rohe    schedule 20.06.2016

может использовать "org.springframework.ws.soap.security.wss4j.Wss4jSecurityInterceptor", хотя он устарел.

Это сработало для меня вместо создания нового расширения для класса, в любом случае я не использую его для какой-либо проверки.

person Arun Pratap Singh    schedule 27.06.2017