第5章 WS-Policy フレームワーク
概要
本章では、WS-Policy フレームワークの基本概念、ポリシーサブジェクトとポリシーアサーションの定義、およびポリシーアサーションがどのように組み合わせてポリシー式を行うかを説明します。
5.1. WS-Policy の概要
概要
WS-Policy 仕様 は、Web サービスアプリケーションで実行時に接続および通信のセマンティクスを変更するポリシーを適用する一般的なフレームワークを提供します。Apache CXF セキュリティーは WS-Policy フレームワークを使用して、メッセージ保護と認証要件を設定します。
ポリシーおよびポリシーの参照
ポリシーを指定する最も簡単な方法は、ポリシーを適用する場所に直接埋め込むことです。たとえば、WSDL コントラクトの特定ポートにポリシーを関連付けるには、以下のように指定します。
<wsdl:definitions targetNamespace="http://tempuri.org/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" ... >
...
<wsdl:service name="PingService10">
<wsdl:port name="UserNameOverTransport_IPingService" binding="BindingName">
<wsp:Policy> <!-- Policy expression comes here! --> </wsp:Policy>
<soap:address location="SOAPAddress"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
ポリシーを指定する代替方法として、ポリシーを適用したい場所にポリシー参照要素 wsp:PolicyReference を挿入し、続いて XML ファイルの他の場所にポリシー要素 wsp:Policy を挿入します。たとえば、ポリシー参照を使用してポリシーを特定ポートに関連付けるには、以下のような設定を使用します。
<wsdl:definitions targetNamespace="http://tempuri.org/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" ... >
...
<wsdl:service name="PingService10">
<wsdl:port name="UserNameOverTransport_IPingService" binding="BindingName">
<wsp:PolicyReference URI="#PolicyID"/>
<soap:address location="SOAPAddress"/>
</wsdl:port>
</wsdl:service>
...
<wsp:Policy wsu:Id="PolicyID">
<!-- Policy expression comes here ... -->
</wsp:Policy>
</wsdl:definitions>
ポリシー参照 wsp:PolicyReference は、ID PolicyID を使用して参照されたポリシーを特定します (URI 属性の # 接頭辞文字の追加に留意してください)。ポリシー自体 wsp:Policy は、属性 wsu:Id="PolicyID" を追加して特定する必要があります。
ポリシーサブジェクト
ポリシーが関連付けられているエンティティーは ポリシーサブジェクト と呼ばれます。たとえば、ポリシーをエンドポイントに関連付けることができます。この場合、エンドポイント はポリシーの対象となります。複数のポリシーを任意のポリシー件名に関連付けることが可能です。WS-Policy フレームワークは、以下のようなポリシー件名をサポートします。
サービスポリシーの件名
ポリシーをサービスに関連付けるには、以下の WSDL 1.1 要素のサブ要素として、<wsp:Policy> 要素または <wsp:PolicyReference> 要素のいずれかを挿入します。
-
wsdl:service— このサービスで提供されるすべてのポート (エンドポイント) にポリシーを適用します。
エンドポイントポリシーサブジェクト
ポリシーをエンドポイントに関連付けるには、以下の WSDL 1.1 要素のサブ要素として、<wsp:Policy> 要素または <wsp:PolicyReference> 要素のいずれかを挿入します。
-
wsdl:portType— このポートタイプを使用するすべてのポート (エンドポイント) にポリシーを適用します。 -
wsdl:binding— このバインディングを使用するすべてのポートにポリシーを適用します。 -
wsdl:port- このエンドポイントにのみポリシーを適用します。
たとえば、ポリシーをエンドポイントバインディングに関連付けるには、以下のようにします (ポリシー参照を使用)。
<wsdl:definitions targetNamespace="http://tempuri.org/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" ... >
...
<wsdl:binding name="EndpointBinding" type="i0:IPingService">
<wsp:PolicyReference URI="#PolicyID"/>
...
</wsdl:binding>
...
<wsp:Policy wsu:Id="PolicyID"> ... </wsp:Policy>
...
</wsdl:definitions>操作ポリシー件名
ポリシーを操作に関連付けるには、以下の WSDL 1.1 要素のサブ要素として、<wsp:Policy> 要素または <wsp:PolicyReference> 要素のいずれかを挿入します。
-
wsdl:portType/wsdl:operation -
wsdl:binding/wsdl:operation
たとえば、以下のようにバインディングでポリシーを操作と関連付けることができます (ポリシー参照を使用)。
<wsdl:definitions targetNamespace="http://tempuri.org/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" ... >
...
<wsdl:binding name="EndpointBinding" type="i0:IPingService">
<wsdl:operation name="Ping">
<wsp:PolicyReference URI="#PolicyID"/>
<soap:operation soapAction="http://xmlsoap.org/Ping" style="document"/>
<wsdl:input name="PingRequest"> ... </wsdl:input>
<wsdl:output name="PingResponse"> ... </wsdl:output>
</wsdl:operation>
...
</wsdl:binding>
...
<wsp:Policy wsu:Id="PolicyID"> ... </wsp:Policy>
...
</wsdl:definitions>メッセージポリシー件名
ポリシーをメッセージに関連付けるには、以下の WSDL 1.1 要素のサブ要素として、<wsp:Policy> 要素または <wsp:PolicyReference> 要素のいずれかを挿入します。
-
wsdl:message -
wsdl:portType/wsdl:operation/wsdl:input -
wsdl:portType/wsdl:operation/wsdl:output -
wsdl:portType/wsdl:operation/wsdl:fault -
wsdl:binding/wsdl:operation/wsdl:input -
wsdl:binding/wsdl:operation/wsdl:output -
wsdl:binding/wsdl:operation/wsdl:fault
たとえば、ポリシー参照を使用して、バインディングのメッセージとポリシーを関連付けることができます。
<wsdl:definitions targetNamespace="http://tempuri.org/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" ... >
...
<wsdl:binding name="EndpointBinding" type="i0:IPingService">
<wsdl:operation name="Ping">
<soap:operation soapAction="http://xmlsoap.org/Ping" style="document"/>
<wsdl:input name="PingRequest">
<wsp:PolicyReference URI="#PolicyID"/>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="PingResponse"> ... </wsdl:output>
</wsdl:operation>
...
</wsdl:binding>
...
<wsp:Policy wsu:Id="PolicyID"> ... </wsp:Policy>
...
</wsdl:definitions>