2

WSO2 ESB でプロキシ サービスを作成し、UsernameToken 認証をセットアップしました。ただし、JDK 内にバンドルされている JAX-WS を使用して UsernameToken を構成するのはそれほど簡単ではないようです (ここで説明されているように)。JDK にパッチを適用する必要があります。UsernameToken のように、ESB の資格情報で基本 HTTP 認証を使用する方法はありますか?

4

1 に答える 1

2

Amila Suriarachchiの記事「Web サービス統合のセキュリティ保護」によると、 「WSO2 carbon は POX メッセージを変換することで、HTTP 基本認証でも UT をサポートします」とありますが、これがあなたの興味に関連するかどうかはわかりません。

ただし、JAX-WS クライアントで UsernameToken 承認を構成することは、思ったほど難しくありません。javax.xml.ws.handler.soap.SOAPHandler を実装するクラスを作成し、handleMessage(SOAPMessageContext messageContext) メソッドをオーバーライドして送信メッセージにセキュリティ ヘッダーを追加するだけです。

私の Java バージョンは 1.6.0_26 (上記のパッチは適用されていません) であり、Web サービス クライアント スタブ クラスは、Web サービスの wsdl に従って JAX-WS RI 2.1.7 によって生成され、UsernameToken シナリオによって保護され、公開されます。 WSO2 Carbon サーバー (つまり、Data Services Server-2.6.3) による

セキュリティ ヘッダーの作成にはApache WSS4Jを使用します。この場合は、org.apache.ws.security.message.WSSecUsernameToken オブジェクトをインスタンス化し、setUserInfo(String user, String password) メソッドを介してユーザー名とパスワードを設定するだけです。また、発信 SOAP メッセージのセキュリティ ヘッダーにタイムスタンプ要素を追加する必要があります。サンプル実装は次のようになります。

public boolean handleMessage(SOAPMessageContext messageContext) {
    Boolean isOutboundMessage = (Boolean) messageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

    if (isOutboundMessage) {
        SOAPPart messageSoapPart = messageContext.getMessage().getSOAPPart();

        WSSecHeader securityHeader = new WSSecHeader();
        securityHeader.insertSecurityHeader(messageSoapPart);
        WSSecUsernameToken usernameToken = new WSSecUsernameToken();

        usernameToken.setPasswordType(WSConstants.PASSWORD_TEXT);
        usernameToken.setUserInfo("root", "top_secret");

        WSSecTimestamp timestamp = new WSSecTimestamp();

        usernameToken.build(messageSoapPart, securityHeader);
        timestamp.build(messageSoapPart, securityHeader);
    }

    return true;
}

言及すべきもう 1 つの重要な点は、SOAP ヘッダー要素に mustUnderstand グローバル SOAP 属性が付属している可能性があることです。Jim White による記事Working with Headers in JAX-WS SOAPHandlers を参照すると、この属性は、Web サービスの受信者または仲介者がメッセージを処理する前にヘッダー要素を理解する必要があるかどうかを示すために使用されます。

mustUnderstand 要素が true に設定されている場合 (soapenv:mustUnderstand="1")、 getHeaders() メソッドをコーディングして、SOAP ハンドラーが一連のヘッダー要素を返すことによって mustUnderstand ヘッダー要素を処理することをランタイム環境に伝える必要があります。 mustUnderstand ヘッダー要素に一致する QName (修飾名) オブジェクト。以下は、Security ヘッダーを処理する getHeaders() メソッドです。

public Set<QName> getHeaders() {
    final String NAMESPACE_URI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
    final String LOCAL_PART = "Security";
    final String PREFIX = "wsse";

    final QName wssecurity = new QName(NAMESPACE_URI, LOCAL_PART, PREFIX);  
    final Set<QName> headers = new HashSet<QName>();
    headers.add(wssecurity);  

    return headers;  
}

最後に、サービス ポートを取得してそのメソッドを呼び出す前に、上記のクラス (たとえば、UsernameTokenSecuritySoapHandler) のインスタンスを Web サービス クライアントのハンドラー チェーンに登録する必要があります。これは、次のコードを使用して実行できます。

    Service service = new Service();
    service.setHandlerResolver(new HandlerResolver() {
        public List<Handler> getHandlerChain(PortInfo portInfo) {
            List<Handler> handlers = new ArrayList<Handler>();
            handlers.add(new UsernameTokenSecuritySoapHandler());
            return handlers;
        }
    });

さらに、Young Yang による JAX-WS API のハンドラ フレームワークに関する優れた記事をここで見つけることができます。

お役に立てれば。

于 2012-08-20T14:07:25.800 に答える