Базовая аутентификация HTTP через перехватчик CXF не работает

У меня возникли проблемы с настройкой заголовка авторизации HTTP для запроса веб-службы с использованием Apache CXF. У меня есть настройка клиента до весны:

<bean id="loggingInInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" />
<bean id="loggingOutInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor" />

<bean id="myHTTPAuthInterceptor" class="my.app.MyHTTPAuthInterceptor" autowire="constructor" />

<bean id="webServiceFactory" class="my.app.WebServiceFactory">
    <property name="wsdlLocation" value="classpath:/my/app/webservice.wsdl" />
    <property name="serviceURL">
        <jee:jndi-lookup jndi-name="webservice/url" />
    </property>
    <property name="inInterceptors">
        <list>
            <ref bean="loggingInInterceptor" />
        </list>
    </property>
    <property name="outInterceptors">
        <list>
            <ref bean="loggingOutInterceptor" />
            <ref bean="myHTTPAuthInterceptor" />
        </list>
    </property>
</bean>

<bean id="myWebService" factory-bean="webServiceFactory" factory-method="getInstance" />

Заголовки устанавливаются через MyHTTPAuthInterceptor следующим образом:

public MyHTTPAuthInterceptor(ConfigDao configDao)
{
    super(Phase.POST_PROTOCOL);

    this.configDao = configDao;
}

@Override
public void handleMessage(Message message) throws Fault
{
    Map<String, List<?>> headers = (Map<String, List<?>>) message.get(Message.PROTOCOL_HEADERS);

    String authString = configDao.getUsername() + ":" + config.getPassword();
    headers.put("Authorization", Collections.singletonList("Basic " + new String(Base64.encodeBase64(authString.getBytes()))));
}

С именем пользователя и обоими настройками «тест», в журналах все выглядит нормально:

Headers: {SOAPAction=[""], Accept=[*/*], Authorization=[Basic dGVzdDp0ZXN0]}

Однако сервер возвращает HTTP 401 :Unauthorized.

Не зная, что происходит не так, я применил совершенно другой подход, изменив заводской код клиента веб-службы. Я добавил базовую политику авторизации в канал клиента вот так:

HTTPConduit httpConduit = (HTTPConduit) client.getConduit();
AuthorizationPolicy authorizationPolicy = new AuthorizationPolicy();
authorizationPolicy.setUserName("test");
authorizationPolicy.setPassword("test");
authorizationPolicy.setAuthorizationType("Basic");
httpConduit.setAuthorization(authorizationPolicy);

Снова протестировал мою настройку, тот же журнал (в другом порядке, хотя):

Headers: {SOAPAction=[""], Authorization=[Basic dGVzdDp0ZXN0], Accept=[*/*]}

Теперь ответ сервера 200 OK!

Вы можете подумать, что проблема решена, но второй подход мне не подходит. Мое приложение представляет собой многопользовательскую среду -, все с разными именами пользователей и паролями. При втором подходе я не могу повторно использовать свой клиент.

Как я могу заставить мой перехватчик работать правильно? Я подключаюсь к неправильной фазе? Имеет ли значение порядок заголовков? Если да, то как мне его изменить?

8
задан verhage 16 August 2012 в 09:30
поделиться