Podstawowe uwierzytelnianie HTTP za pośrednictwem przechwytywacza CXF nie działa

Mam pewne problemy z ustawieniem nagłówka autoryzacji HTTP dla żądania usługi WWW przy użyciu Apache CXF. Mam skonfigurowanego klienta przez wiosnę:

<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" />

Nagłówki są ustawiane za pomocą MyHTTPAuthInterceptor w następujący sposób:

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()))));
}

Z nazwą użytkownika i ustawieniem „test” wszystko wydaje się być w porządku w dziennikach:

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

Serwer zwraca jednak HTTP 401: Nieautoryzowane.

Nie wiedząc, co się dzieje, podjąłem zupełnie inne podejście, zmieniając kod fabryczny klienta usługi internetowej. Dodałem podstawowe zasady autoryzacji do kanału klienta:

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

Przetestowałem ponownie moją konfigurację, ten sam dziennik (inna kolejność):

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

Teraz odpowiedź serwera to 200 OK!

Problem można rozwiązać, ale drugie podejście nie działa dla mnie. Moja aplikacja to środowisko dla wielu dzierżawców, wszystkie z inną nazwą użytkownika i hasłem. Przy drugim podejściu nie mogę ponownie wykorzystać mojego klienta.

Jak mogę sprawić, by mój przechwytywacz działał poprawnie? Czy podłączam się do niewłaściwej fazy? Czy kolejność nagłówków ma znaczenie? Jeśli tak, jak mogę to zmienić?

questionAnswers(2)

yourAnswerToTheQuestion