Какова правильная конфигурация службы CXF SOAP с UsernameTokenSignature?

Я пытаюсь настроить службу и клиент CXF, используя UsernameTokenSignature. Начальная точка — это существующая служба с кодом. К сожалению, все примеры, которые я нашел, используют WS-Policy, которая, как я понимаю, не поддерживается CXF в первом сценарии кода.

Мне удалось создать клиент, который отправляет сообщения, как я ожидаю, используя эту конфигурацию:

Клиент:

<jaxws:client id="clientWithUsernameTokenSignature" serviceClass="mypackage.MyServiceInterface" address="http://localhost:8081/ws-security-secured-soap-service/services/Service_v1">
    <jaxws:outInterceptors>
        <ref bean="WSS4JOutInterceptor_UsernameTokenSignature" />
    </jaxws:outInterceptors>
</jaxws:client>

WSS4JOutInterceptor

 <bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor" id="WSS4JOutInterceptor_UsernameTokenSignature">
    <constructor-arg>
        <map>
            <entry key="action" value="UsernameTokenSignature" />
            <entry key="user" value="Admin" />
            <entry key="passwordCallbackClass" value="mypackage.ClientCallbackHandler" />
        </map>
    </constructor-arg>
</bean>

Однако мне не удалось настроить службу для правильной обработки сообщений от этого клиента. Я старался:

Сервис:

<jaxws:endpoint id="soapServ_v3" implementor="#myServiceFacade" address="/MyService_v1">
        <jaxws:inInterceptors>
            <ref bean="WSS4JInInterceptor_UsernameTokenSignature" />
        </jaxws:inInterceptors>
</jaxws:endpoint>

WSS4JInInterceptor

<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor" id="WSS4JInInterceptor_UsernameTokenSignature">
    <constructor-arg>
        <map>
            <entry key="action" value="UsernameTokenSignature" />
            <entry key="passwordCallbackClass" value="mypackage.ServerCallbackHandler" />
        </map>
    </constructor-arg>
</bean>

При этом сервер не принимает сообщения от клиента и отвечает ошибкой безопасности. При отладке я обнаружил, что первое место, где он терпит неудачу, — это verifyUnknownPassword в org.apache.wss4j.dom.validate.UsernameTokenValidator. Здесь для параметра allowUsernameTokenDerivedKeys установлено значение false. Я предполагаю, что есть некоторая конфигурация, которую я могу установить, чтобы получить значение true.

Какая правильная конфигурация сервера позволяет использовать ключи, производные от токена имени пользователя?

Даже если я использую отладчик, чтобы изменить значение на true, вызов службы все равно не работает. В этом случае перехватчик выдает исключение в checkActions: «Обнаружена ошибка при обработке заголовка».

Так что я предполагаю, что мне нужно настроить что-то еще. Кто-нибудь знает, как это правильно настроить?


person Gunnar Kiesel    schedule 29.07.2015    source источник
comment
Какую версию cxf вы используете?   -  person soilworker    schedule 30.07.2015
comment
Не могли бы вы опубликовать точную ошибку, которую вы получили?   -  person soilworker    schedule 31.07.2015


Ответы (1)


Хорошо, я наконец понял это. Для логического свойства «allowUsernameTokenNoPassword» необходимо установить значение «true», чтобы сервер принимал UT без пароля. Затем, чтобы пройти проверку заголовка безопасности, в качестве действия необходимо добавить «UsernameTokenNoPassword».

Рабочая конфигурация выглядит так:

WSS4JInInterceptor:

<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor" id="WSS4JInInterceptor_UsernameTokenSignature">
    <constructor-arg>
        <map>
            <entry key="action" value="UsernameTokenSignature UsernameTokenNoPassword" />
            <entry key="allowUsernameTokenNoPassword" value="true" />
            <entry key="passwordCallbackClass" value="mypackage.ServerCallbackHandler" />
        </map>
    </constructor-arg>
</bean>
person Gunnar Kiesel    schedule 31.07.2015