2016-06-06 12 views
1

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

+0

Заменить' классы wss4j2' для 'wss4j' : они устарели, но фактически работают – EliuX

ответ

0

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

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

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

@Override защищен недействительным validateMessage (SOAPMessage SOAPMessage, MessageContext MessageContext) бросает WsSecurityValidationException {
возвращение;
}

+0

Это не совсем ответ. – gobrewers14

+0

@ GoBrewers14 - У вас есть лучший подход к решению этого вопроса? – springbee

0

Я нашел работу, которая работает для меня. Конечно, лучше было бы исправить в следующей версии 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); 
    } 
} 
2

Я была такая же проблема - никакого способа избежать проверки - но я решил ее:

заходящего ValidateRequest и validateResponse ложь в перехватчика.

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

0

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

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