3.10.4 認証情報の取得・設定手順

JAX-WS機能を使用して開発したWebサービスに対して認証機能を設定したい場合,Webサービスセキュリティ機能が提供するAPIを利用すると,メッセージ内のUsernameToken要素を操作できます。ここでは,UsernameToken要素を操作することで,認証情報を取得または設定する方法を説明します。

<この項の構成>
(1) Webサービス側での認証情報の取得
(2) Webサービスクライアント側での認証情報の設定

(1) Webサービス側での認証情報の取得

Webサービスが受信したメッセージの認証情報は,JAX-WS機能のサポート範囲内でアクセスできるメッセージコンテキストから取得します。手順を次に示します。

  1. Webサービス実装クラスでjavax.xml.ws.WebServiceContextクラスのインスタンス変数を宣言します。
  2. 手順1で宣言したインスタンス変数をjavax.annotation.Resourceアノテーションでアノテートします。
  3. Webサービス実装クラスのメソッド内で,手順1で宣言したインスタンス変数のgetMessageContext()メソッドを呼び出します。
  4. 呼び出したgetMessageContext()メソッドの戻り値として,MessageContextインタフェースを取得します。
  5. WSSConstants.WSS_RECV_ELEMENTPROXYをキーとしてMessageContextインタフェースからjava.util.List<WSSElementProxy>クラスのオブジェクトを取得します。

これらの手順に従って,Webサービス実装クラスTestJaxWsImplのメソッドjaxWsTest()でメッセージコンテキストを取得する例を示します。

import javax.annotation.Resource;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
import com.cosminexus.wss.element.WSSConstants;
・・・
public class TestJaxWsImpl {
   @Resource WebServiceContext wsContext;
   public String jaxWsTest()
       throws UserDefinedException
   {
       ・・・
       MessageContext msgContext = wsContext.getMessageContext();
       Object obj = msgContext.get(WSSConstants.WSS_RECV_ELEMENTPROXY);
       ・・・
  }
}

(2) Webサービスクライアント側での認証情報の設定

Webサービスクライアントが送信するメッセージに認証情報を設定したい場合,JAX-WS機能のサポート範囲内のメッセージコンテキストを設定します。手順を次に示します。

  1. WebサービスクライアントのサービスクラスからSEI(ポート)を取得します。
  2. SEIからgetRequestContext()メソッドを呼び出し,戻り値としてMessageContextインタフェースを取得します。
  3. WSSConstants.WSS_SEND_ELEMENTPROXYをキーとしてMessageContextインタフェースにWSSElementProxyクラスを設定します。

これらの手順に従って,WebサービスクライアントのTestClientクラスを利用してメッセージコンテキストを取得する例を示します。

import java.util.Map;
import javax.xml.ws.BindingProvider;
import com.cosminexus.wss.element.WSSConstants;
import com.cosminexus.wss.element.WSSElementProxy;
import com.cosminexus.wss.element.WSSElementProxyBuilder;
import com.example.sample.TestJaxWs;
import com.example.sample.TestJaxWsService;
・・・
public class TestClient {
   public static void main( String[] args ) {
       ・・・
       TestJaxWsService service = new TestJaxWsService();
       TestJaxWs port = service.getTestJaxWs();
       ・・・
       WSSElementProxyBuilder proxyBuilder = WSSElementProxyBuilder.newInstance();
       WSSElementProxy proxy = proxyBuilder.createWSSElementProxy();
       ・・・
       Map<String, Object> context = ((BindingProvider) port).getRequestContext();
       context.put(WSSConstants.WSS_SEND_ELEMENTPROXY, proxy);
       ・・・
   }