3.10.4 認証情報の取得・設定手順
JAX-WS機能を使用して開発したWebサービスに対して認証機能を設定したい場合,Webサービスセキュリティ機能が提供するAPIを利用すると,メッセージ内のUsernameToken要素を操作できます。ここでは,UsernameToken要素を操作することで,認証情報を取得または設定する方法を説明します。
(1) Webサービス側での認証情報の取得
Webサービスが受信したメッセージの認証情報は,JAX-WS機能のサポート範囲内でアクセスできるメッセージコンテキストから取得します。手順を次に示します。
-
Webサービス実装クラスでjavax.xml.ws.WebServiceContextクラスのインスタンス変数を宣言します。
-
手順1で宣言したインスタンス変数をjavax.annotation.Resourceアノテーションでアノテートします。
-
Webサービス実装クラスのメソッド内で,手順1で宣言したインスタンス変数のgetMessageContext()メソッドを呼び出します。
-
呼び出したgetMessageContext()メソッドの戻り値として,MessageContextインタフェースを取得します。
-
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機能のサポート範囲内のメッセージコンテキストを設定します。手順を次に示します。
-
WebサービスクライアントのサービスクラスからSEI(ポート)を取得します。
-
SEIからgetRequestContext()メソッドを呼び出し,戻り値としてMessageContextインタフェースを取得します。
-
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); ・・・ }