Миграция на CXF 3.2.7 -> Как устранить ошибку безопасности, связанную с паролем, во время обработки SOAP RQ? - PullRequest
0 голосов
/ 16 ноября 2018

Контекст : я пытаюсь перенести веб-сервис с CXF 2.2.2 на CXF 3.2.7

Проблема : после миграции, когда я пытаюсь запуститьниже HTTP-POST SOAP-запрос к моему веб-сервису через программное обеспечение, подобное SOAP UI:

<SOAP-ENV:Header>
      <wsse:Security SOAP-ENV:mustUnderstand="1">
        <wsse:UsernameToken wsu:Id="">
        <wsse:Username>sampleUser</wsse:Username>
        <wsse:Password>12345</wsse:Password>
        <wsse:PartnerID>samplePartner</wsse:PartnerID>
</wsse:UsernameToken>
</wsse:Security>
    <wsa:To>http://localhost:8080/sampleWs</wsa:To>
    <wsa:Action>http://localhost:8080/sampleWs/sampleAction</wsa:Action>
      <wsa:From>
      <wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
</wsa:From>
</SOAP-ENV:Header>

Я получаю следующее исключение безопасности из модуля безопасности CXF:

18:11:29,250 WARNING [org.apache.cxf.phase.PhaseInterceptorChain] (http-127.0.0.1:8080-1) Interceptor for {http://ws.sampleWs.varun/}SampleWebService has thrown exception, unwinding now: org.apache.cxf.binding.soap.SoapFault: A security error was encountered when verifying the message
        at org.apache.cxf.ws.security.wss4j.WSS4JUtils.createSoapFault(WSS4JUtils.java:234) [cxf-rt-ws-security-3.2.7.jar:3.2.7]
        at org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessageInternal(WSS4JInInterceptor.java:341) [cxf-rt-ws-security-3.2.7.jar:3.2.7]
        at org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessage(WSS4JInInterceptor.java:176) [cxf-rt-ws-security-3.2.7.jar:3.2.7]
        at org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessage(WSS4JInInterceptor.java:87) [cxf-rt-ws-security-3.2.7.jar:3.2.7]
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) [cxf-core-3.2.7.jar:3.2.7]
        at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) [cxf-core-3.2.7.jar:3.2.7]
        .
        .
        .
Caused by: org.apache.wss4j.common.ext.WSSecurityException: BSP:R4201: Any PASSWORD MUST specify a Type attribute
        at org.apache.wss4j.common.bsp.BSPEnforcer.handleBSPRule(BSPEnforcer.java:57) [wss4j-ws-security-common-2.2.2.jar:2.2.2]
        at org.apache.wss4j.dom.message.token.UsernameToken.checkBSPCompliance(UsernameToken.java:834) [wss4j-ws-security-dom-2.2.2.jar:2.2.2]
        at org.apache.wss4j.dom.message.token.UsernameToken.<init>(UsernameToken.java:143) [wss4j-ws-security-dom-2.2.2.jar:2.2.2]
        at org.apache.wss4j.dom.processor.UsernameTokenProcessor.handleUsernameToken(UsernameTokenProcessor.java:137) [wss4j-ws-security-dom-2.2.2.jar:2.2.2]
        at org.apache.wss4j.dom.processor.UsernameTokenProcessor.handleToken(UsernameTokenProcessor.java:62) [wss4j-ws-security-dom-2.2.2.jar:2.2.2]
        at org.apache.wss4j.dom.engine.WSSecurityEngine.processSecurityHeader(WSSecurityEngine.java:340) [wss4j-ws-security-dom-2.2.2.jar:2.2.2]
        at org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessageInternal(WSS4JInInterceptor.java:285) [cxf-rt-ws-security-3.2.7.jar:3.2.7]
        ... 28 more

Появляется основная причинабыть отсутствующим атрибутом в теге wsse:password.

Я проверил спецификации WS безопасности: http://docs.oasis -open.org / wss / 2004/01 / oasis-200401-wss-wssecurity-secext-1.0.xsd

Там я не смог найти обязательный атрибут типа для wsse:password, как ожидалось последним CXF.

Примечание : Тот же запрос обрабатывается в CXF версии 2.2.2

Вопрос : Есть ли способ предотвратить сброс CXF вышеуказанного запроса и разрешить его выполнение.Я много смотрел вокруг, но не мог найти ответы?Какие-либо предложения ?ИЛИ изменение запроса SOAP - единственное решение?

1 Ответ

0 голосов
/ 20 ноября 2018

Вышеупомянутый запрос отбрасывается, потому что, как было сказано ранее @GPI, CXF пытается принудительно применить R4201 Базовых спецификаций безопасности (http://www.ws -i.org / Profiles / basicsecurityprofile-1.1.html ).

Чтобы запретить принудительное применение CXF, мы можем использовать константы конфигурации, предоставленные ws-security и wss4j, которые инструктируют CXF остановить принудительное применение.

Решение № 1 (с использованием перехватчика WSS4J)

В вашем весеннем конфигурационном файле вы можете установить isBspCompliant на false:

    <jaxws:inInterceptors>
        <bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
            <constructor-arg>
                <map>
                    <entry key="action" value="UsernameToken" />
                    <entry key="passwordType" value="PasswordText" />
                    <entry key="passwordCallbackRef">
                        <ref bean="passwordCallback" />
                    </entry>
                    <entry key="isBSPCompliant" value="false"/>
                </map>
            </constructor-arg>
        </bean>
    </jaxws:inInterceptors>

Решение № 2 (с использованием JAX-WS)

В вашем весеннем конфигурационном файле вы можете установить ws-security.is-bsp-compliant на false:

    <jaxws:endpoint id="sample" implementor="sample.ws.SampleWebService" address="/SampleWebService">
    <jaxws:properties> 
    <entry key="ws-security.is-bsp-compliant" value="false"/> 
    </jaxws:properties> 
</jaxws:endpoint>

Дополнительные параметры конфигурации вы можете найти на следующих страницах:

http://ws.apache.org/wss4j/config.html

http://cxf.apache.org/docs/ws-securitypolicy.html

...