2

私は、サービス呼び出しの前に HTTP 基本認証を要求するセキュリティ プロキシの背後にある CXF Web サービスの開発に取り組んできました。これらのサービスは相互に通信し、リクエストとレスポンスの両方で認証を必要とします。

これまでのところ、リクエストに対して HTTPConduit を介して HTTP 基本認証を次のように設定できました。

    Client client = ClientProxy.getClient(port);
    HTTPConduit conduit = (HTTPConduit) client.getConduit();
    AuthorizationPolicy authorizationPolicy = new AuthorizationPolicy();
    authorizationPolicy.setUserName(username);
    authorizationPolicy.setPassword(password);
    authorizationPolicy.setAuthorizationType("Basic");
    conduit.setAuthorization(authorizationPolicy);

上記のメソッドは、すべてのサービス メソッド呼び出しで呼び出され、次の形式で正しい受信メッセージを取得しています。

INFO: Inbound Message
----------------------------
ID: 1
Address: http://someURL/someService?wsdl
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml; charset=UTF-8
Headers: {Accept=[*/*], Authorization=[Basic {TOKEN}], 
                cache-control=[no-cache], connection=[keep-alive], 
                Content-Length=[735], content-type=[text/xml; charset=UTF-8], 
                pragma=[no-cache], ...}
Payload: <soap:Envelope>...</soap:Envelope>
--------------------------------------

ただし、応答には必要なヘッダーが含まれていません

INFO: Outbound Message
---------------------------
ID: 2
Encoding: UTF-8
Content-Type: text/xml
Headers: {}
Payload: <soap:Envelope/">...</soap:Envelope>
--------------------------------------

応答 HTTP ヘッダーを変更するにはどうすればよいですか? 私はもう試した

((BindingProvider)port).getResponseContext().put(
           MessageContext.HTTP_RESPONSE_HEADERS, 
           Collections.singletonMap("Authentication", 
           Collections.singletonList("Basic "+token)));

望ましい結果を得ることなく。

4

1 に答える 1

9

1 つのアプローチは、CXF インターセプターを作成することです。

public class BasicAuthOutInterceptor extends AbstractPhaseInterceptor<Message> {

    public BasicAuthOutInterceptor() {
        super(Phase.PRE_STREAM);
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        String token = "basic auth token";

        @SuppressWarnings("unchecked")
        Map<String, List<String>> headers = (Map<String, List<String>>) message
                .get(Message.PROTOCOL_HEADERS);
        if (headers == null) {
            headers = new TreeMap<String, List<String>>(
                    String.CASE_INSENSITIVE_ORDER);
            message.put(Message.PROTOCOL_HEADERS, headers);
        }

        headers.put("Authentication", Arrays.asList("Basic "+ token));
    }

}

out および outFault インターセプターとして登録します。

    <bean id="basicAuthOutInterceptor class="BasicAuthOutInterceptor" />

    <cxf:bus>
        <cxf:outInterceptors>
            <ref bean="basicAuthOutInterceptor"/>
        </cxf:outInterceptors>
        <cxf:outFaultInterceptors>
            <ref bean="basicAuthOutInterceptor"/>
        </cxf:outFaultInterceptors>        
    </cxf:bus> 
于 2013-05-24T20:35:05.537 に答える