Menu Close

第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" を追加して特定する必要があります。

ポリシーサブジェクト

ポリシーが関連付けられたエンティティーは ポリシーサブジェクト と呼ばれます。たとえば、ポリシーをエンドポイントに関連付けることができます。この場合、endpoint はポリシーサブジェクトになります。複数のポリシーを任意のポリシーサブジェクトに関連付けることができます。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>