Fusion Middleware Oracle Web Services Manager拡張ガイド

11gリリース1 (11.1.1.6)

B66193-01(原本部品番号:E13882-03)

目次

タイトルおよび著作権情報

はじめに

- 対象読者

- このマニュアルの使用方法

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

1 ポリシーとアサーションについて

- 1.1 事前定義済のポリシーとアサーション

- 1.2 ポリシーの作成

- 1.3 カスタム・アサーションについて

- 1.3.1 ポリシー、アサーション、式およびオペレータ

- 1.3.2 アサーション・カテゴリについて

- 1.3.3 カスタム・アサーションのバインディングのルール

- 1.3.4 カスタム・アサーションのライフサイクル

- 1.3.5 カスタム・アサーションのタイプ

2 カスタム・アサーションの作成

- 2.1 ポリシーとアサーションのネーミング規則

- 2.2 Webサービスのためのカスタム・アサーションの開発

- 2.2.1 手順1: カスタム・アサーション・エグゼキュータの作成

- 2.2.2 手順2: カスタム・ポリシー・ファイルの作成

- 2.2.3 手順3: カスタム・アサーション・エグゼキュータの指定

- 2.2.4 手順4: JARファイルの作成

- 2.2.5 手順5: カスタム・ポリシーのポリシー・ストアへの追加

- 2.2.6 手順6: カスタム・アサーションのデプロイ

- 2.2.7 手順7: Webサービスへのカスタム・ポリシーの添付

- 2.2.8 手順8: クライアントの生成

- 2.3 Webサービスのテスト

- 2.4 カスタム・アサーションでのカスタム・クライアント・ポリシーの作成

3 サンプル・カスタム・アサーションによる手順

- 3.1 概要

- 3.2 IPアドレス検証のカスタム・アサーションのサンプル

- 3.2.1 コード・サンプル

- 3.2.2 このサンプルの実行

- 3.3 暗号化と復号化のカスタム・アサーションのサンプル

- 3.3.1 コード・サンプル

- 3.3.2 サンプルの実行

- 3.4 認証のカスタム・アサーションのサンプル

- 3.4.1 コード・サンプル

- 3.4.2 サンプルの実行

4 カスタム・アサーションの高度な機能の実装

- 4.1 カスタム・アサーションへのパラメータの入力

- 4.2 Oracle WSMコンテキスト・プロパティへのアクセス

- 4.3 リクエスト、レスポンスおよびフォルト・メッセージ・オブジェクトへのアクセス

- 4.4 XPathによるメッセージのパーツへのアクセス

- 4.5 SSLのコンテナで使用される証明書へのアクセス

- 4.6 トランスポート・プロパティへのアクセス

- 4.7 CSFキーへのアクセス

- 4.8 カスタム・アサーションでの例外処理

A カスタム・アサーションのスキーマ参照

- A.1 図解

- A.2 要素の説明

- A.2.1 wsp:Policy

- A.2.2 orasp:Assertion

- A.2.3 orawsp:bindings

- A.2.4 orawsp:Implementation

- A.2.5 orawsp:Config

- A.2.6 orawsp:PropertySet

- A.2.7 orawsp:Property

- A.2.8 orawsp:Description

- A.2.9 orawsp:Value

Oracle® Fusion Middleware

Oracle Web Services Manager拡張ガイド

11gリリース1 (11.1.1.6)

B66193-01(原本部品番号:E13882-03)

2011年11月

このマニュアルでは、カスタム・アサーションを開発する方法について説明します。

Oracle Fusion Middleware Oracle Web Services Manager拡張ガイド 11gリリース1 (11.1.1.6)

B66193-01

Copyright (C) 2011, Oracle and/or its affiliates.All rights reserved.

原本著者: Oracle Corporation

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT RIGHTS Programs, software, databases, and related documentation and technical data delivered to U.S. Government customers are "commercial computer software" or "commercial technical data" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, the use, duplication, disclosure, modification, and adaptation shall be subject to the restrictions and license terms set forth in the applicable Government contract, and, to the extent applicable by the terms of the Government contract, the additional rights set forth in FAR 52.227-19, Commercial Computer Software License (December 2007).Oracle America, Inc., 500 Oracle Parkway, Redwood City, CA 94065.

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション（人的傷害を発生させる可能性があるアプリケーションを含む）への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性（redundancy）、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

はじめに

ここでは、ドキュメントのアクセシビリティ機能とこのマニュアル(『Oracle Web Services Manager拡張ガイド』)で使用される規則について説明します。

対象読者

このマニュアルは、Webサービスのためにカスタム・アサーションを作成するソフトウェア開発者を対象としています。

このマニュアルの使用方法

このマニュアルでは、次の項目について説明しています。

ポリシーとアサーションについて

- 事前定義済のポリシーとアサーションについての学習
詳細は、事前定義済のポリシーとアサーションおよびカスタム・アサーションに関する項を参照してください。

- カスタム・アサーションのパーツとタイプについての学習
詳細は、ポリシー、アサーション、式およびオペレータおよびカスタム・アサーションのタイプに関する項を参照してください。

- カテゴリとバインディングのルールと制限事項の確認
詳細は、アサーション・カテゴリおよびカスタム・アサーションのバインディングのルールに関する項を参照してください。

- カスタム・アサーションのライフサイクルの確認
詳細は、カスタム・アサーションのライフサイクルに関する項を参照してください。

- カスタム・アサーションのタイプの理解
詳細は、カスタム・アサーションのタイプに関する項を参照してください。

カスタム・アサーションの作成

- ポリシーとアサーションのネーミング規則の確認
詳細は、ポリシーとアサーションのネーミング規則に関する項を参照してください。

- カスタム・アサーションの作成
詳細は、Webサービスのためのカスタム・アサーションの開発に関する項を参照してください。

- カスタム・アサーションのテスト
詳細は、Webサービスのテストに関する項を参照してください。

- カスタム・アサーションを使用して作成されたWebサービス・ポリシーからクライアント・ポリシーを生成
詳細は、カスタム・アサーションでのカスタム・クライアント・ポリシーの作成に関する項を参照してください。

コード例

- IPアドレス検証のカスタム・アサーションのサンプル

- 暗号化と復号化のカスタム・アサーションのサンプル

- 認証のカスタム・アサーションのサンプル

詳細なトピック

- 高度な機能の実装:

- アサーションへのパラメータの入力

- Oracle WSMコンテキスト・プロパティへのアクセス

- リクエスト、レスポンスおよびフォルト・メッセージ・オブジェクト

- XPathに基づいたメッセージの特定のパーツへのアクセス

- SSLのコンテナで使用される証明書へのアクセス

- HTTPリクエストおよびレスポンスなどのトランスポート・プロパティへのアクセス

- CSFキーへのアクセス

詳細は、カスタム・アサーションの高度な機能の実装に関する項を参照してください。

- 例外処理
詳細は、カスタム・アサーションでの例外処理に関する項を参照してください。

リファレンス

- カスタム・アサーションを作成するためのXMLスキーマ
詳細は、カスタム・アサーションのスキーマ参照に関する項を参照してください。

- Oracle WSMのJava APIリファレンス
詳細は、Oracle Web Services Manager Java APIリファレンスを参照してください。

ドキュメントのアクセシビリティについて

Oracleのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイトhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=docaccを参照してください。

Oracleサポートへのアクセス

Oracleのお客様は、My Oracle Supportにアクセスして電子サポートを受けることができます。詳細情報はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=infoか、聴覚に障害のあるお客様はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trsを参照してください。

関連ドキュメント

詳細は、次のOracleドキュメントを参照してください。

- Linux x86でのOracle Fusion Middlewareのリリース・ノート

- Oracle Fusion Middlewareリリース・ノートfor Microsoft Windows

- Oracle Fusion Middleware Web Servicesのためのセキュリティと管理者ガイド

- OTNにあるOracle Fusion Middlewareのライブラリ

表記規則

このマニュアルでは次の表記規則を使用します。

規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック体

イタリックは、ユーザーが特定の値を指定するプレースホルダ変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

1 ポリシーとアサーションについて

Oracle Web Services Manager (Oracle WSM)では、Oracle Fusion Middlewareをインストールすると自動的に使用可能になる、一連の事前定義済ポリシーとアサーション・テンプレートを提供します。製品に含まれる標準ポリシーで特定の機能が提供されない場合に、カスタム・アサーションの開発が必要になることがあります。たとえば、Oracle WSMで提供されない種類の認証をアプリケーションで使用する必要が生じることがあります。この場合は、カスタム認証アサーションを作成する必要があります。このマニュアルでは、カスタム・アサーションの開発、デプロイおよびテストの方法について説明します。

この章のトピックは、次のとおりです。

- 事前定義済のポリシーとアサーション

- ポリシーの作成

- カスタム・アサーションについて

1.1 事前定義済のポリシーとアサーション

Oracle Fusion Middleware 11gリリース1 (11.1.1)には、事前定義済ポリシーがパッケージされています。Oracle Fusion Middleware Webサービスのポリシーの詳細は、『Oracle Fusion Middleware Webサービスのためのセキュリティおよび管理者ガイド』を参照してください。

各ポリシーは、ドメインレベルで定義された、セキュリティ要件を定義する1つ以上のアサーションで構成されます。そのまま使用できる事前定義済アサーションのセットが用意されています。事前定義済アサーションは、『Oracle Fusion Middleware Web Servicesセキュリティおよび管理者ガイド』の付録C「事前定義済のアサーション・テンプレート」に説明されています。

既存の事前定義済アサーションの使用の詳細は、『Oracle Fusion Middleware Web Servicesセキュリティおよび管理者ガイド』のポリシー・アサーション・テンプレートの管理に関する項を参照してください。既存のアサーションを使用するほかに、Oracle WSMのAPIを使用して、独自のカスタム・アサーションを開発できます。

1.2 ポリシーの作成

Webサービス・ポリシーは、次のいずれかの方法で作成できます。

- 既存のアサーション・テンプレートを使用して新しいポリシーを作成

- 既存のポリシーから新規ポリシーを作成

- ファイルからポリシーをインポート

- カスタム・アサーションからポリシーを作成

ポリシーを作成する最初の3つの方法は、『Oracle Fusion Middleware Web Servicesセキュリティおよび管理者ガイド』のWebサービス・ポリシーの管理に関する項に説明されています。このマニュアルでは、開発したカスタム・アサーションを使用してポリシーを作成する方法について説明します。

1.3 カスタム・アサーションについて

この項では、次の項目について説明します。

- 1.3.1 ポリシー、アサーション、式およびオペレータ

- 1.3.2 アサーション・カテゴリについて

- 1.3.3 カスタム・アサーションのバインディングのルール

- 1.3.4 カスタム・アサーションのライフサイクル

- 1.3.5 カスタム・アサーションのタイプ

1.3.1 ポリシー、アサーション、式およびオペレータ

Webサービスはポリシーを使用して、機能と要件を指定します。ポリシーは、メッセージを確実に保護して提供する方法やメッセージがトランザクションをフローする必要があるかどうかを定義します。ポリシーはアサーションのセット(ルール、要件、義務)で、Webサービスの特定のポリシー要件やプロパティを表します。

ポリシー・アサーションは、ポリシーの個別の要件、機能またはプロパティを表す基本的な単位です。アサーションはドメイン固有のセマンティクスを使用して、相互運用性を有効にします。

ポリシー式はポリシーのXML表記です。ポリシー式は、wsp:Policy要素のコンテンツを形成する基本的なポリシー・アサーションの様々な論理的組合せから構成されます。論理的組合せは、ポリシー・オペレータ(wsp:Policy、wsp:Allおよびwsp:ExactlyOne要素)を使用して作成されます。

例1-1では、1つのアサーション(orasp:AssertionOne)を含むポリシー(wsp:Policy要素で定義済)を示しています。要素と属性のOracleの拡張機能の詳細は、付録A「カスタム・アサーションのスキーマ参照」を参照してください。

例1-1 1つのアサーションを含むポリシー

<wsp:Policy
xmlns="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:orasp="http://schemas.oracle.com/ws/2006/01/securitypolicy" >

<orasp:AssertionOne orawsp:Silent="true" orawsp:Enforced="true"
orawsp:name="Validator"
orawsp:category="security/authentication">
...
</orasp:AssertionOne>
</wsp:Policy>

例1-2では、ポリシー・オペレータのwsp:All要素(リスト内のすべてのポリシー・アサーションはtrueと評価される必要があります)によってラップされたポリシー・アサーションのリストを示しています。wsp:Policy要素はwsp:Allと同じ意味です。

例1-2 2つのアサーションとwsp:Allオペレータを含むポリシー

<wsp:Policy
xmlns="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:orasp="http://schemas.oracle.com/ws/2006/01/securitypolicy" >

<wsp:All>
<orasp:AssertionOne orawsp:Silent="true" orawsp:Enforced="true"
orawsp:name="SAMLValidator"
orawsp:category="security/authentication">
...
</orasp:AssertionOne>
<orasp:AssertionTwo orawsp:Silent="true" orawsp:Enforced="true"
orawsp:name="UserNameValidator"
orawsp:category="security/authentication">
...
</orasp:AssertionTwo>
</wsp:All>

</wsp:Policy>

例1-3では、オペレータ<wsp:All>...</wsp:All>内の各行有効な代替ポリシーを表しています。代替ポリシーのいずれかのセットがtrueである場合、ポリシーを満たしています。

例1-3 多数のアサーションとwsp:ExactlyOneオペレータを含むポリシー

<wsp:Policy
xmlns="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:orasp="http://schemas.oracle.com/ws/2006/01/securitypolicy" >

<wsp:ExactlyOne>
<wsp:All>
<orasp:SAML orawsp:Silent="true" orawsp:Enforced="true"
orawsp:name="SAML"
orawsp:category="security/authentication">
...
</orasp:SAML>
</wsp:All>
<wsp:All>
<orasp:Username orawsp:Silent="true" orawsp:Enforced="true"
orawsp:name="Username"
orawsp:category="security/authentication">
...
</orasp:Username>
</wsp:All>

</wsp:ExactlyOne>
</wsp:Policy>

オペレータおよびポリシー・アサーションの組合せを使用すると、複雑な代替ポリシーを作成できます。

1.3.2 アサーション・カテゴリについて

表1-1では、準拠しているWebサービスの仕様と重要度に基づいたアサーション・カテゴリのリストを示しています。orasp:Assertion要素の属性であるorawsp:categoryを使用して、カテゴリを指定します。第3章「サンプル・カスタム・アサーションによる手順」では、セキュリティ・カスタム・アサーションの様々なカテゴリのサンプルを示しています。

表1-1 アサーション・カテゴリ

カテゴリ

説明

orawsp:categoryの有効な値

セキュリティ

SAML、KerberosおよびX.509などの様々なセキュリティ・トークン・フォーマットの通信を許可するWS-Security 1.0および1.1標準を実装するポリシー。これらの標準によって、ユーザーの認証と認可、アイデンティティ伝播およびメッセージ保護が実施されます。

security/authentication、security/msg-protection、security/authorization、security/logging

MTOMアタッチメント

MTOM形式のアタッチメントを含むポリシー。Message Transmission Optimization Mechanism(MTOM)形式によって、Webサービスとの間で送受信するバイナリ・データを効率的に転送できるようになります。

mtom

信頼できるメッセージング

WS-ReliableMessagingプロトコルをサポートしているポリシー。これにより、SOAPのメッセージ配信が保証されます。WS-ReliableMessagingは信頼できるメッセージング・ソースと信頼できるメッセージングの宛先を利用し、多数の配信保証をサポートします。詳細は、http://docs.oasis-open.org/ws-rx/wsrm/200702のWS-ReliableMessaging仕様を参照してください。

wsrm

WSアドレス

Simple Object Access Protocol(SOAP)メッセージがWS-Addressingヘッダーを含み、Webサービスがアドレス情報をやり取りできるポリシー。

addressing

管理

メッセージ・ログにリクエスト、レスポンスおよびフォルト・メッセージを記録するために使用される管理ポリシー。

management

Enterprise Manager Fusion Middlware Controlを使用すると、様々なカテゴリのポリシーを表示、編集および管理できます。カテゴリのポリシーを特定のエンドポイントに対して添付できることに注意してください。カスタム・アサーションのバインディングのルールの詳細は、次の項を参照してください。

1.3.3 カスタム・アサーションのバインディングのルール

アサーションのバインディングを定義するために使用する要素の詳細は、『Oracle Fusion Middleware Web Servicesセキュリティおよび管理者ガイド』のorawsp:bindingsに関する項を参照してください。

1.3.4 カスタム・アサーションのライフサイクル

カスタム・アサーションのライフサイクルには、初期化、実行、実行後の処理および終了処理の4段階があります。Oracle WSMランタイムはカスタム・アサーションのライフサイクルを管理します。各段階で、Oracle WSMランタイムはカスタム・アサーション・エグゼキュータのライフサイクルのメソッドを起動します。カスタム・ポリシーのカスタム・アサーション・エグゼキュータ内で、次のメソッドを実装する必要があります。

1. void init(IAssertion ia, IExecutionContext context, IContext msgContext): このメソッドは、AssertionExecutorが作成された後か、プロパティのいずれかが変更された後に呼び出されます。

2. IResult execute(IContext mcontext): このメソッドは、リクエスト、レスポンスおよびフォルトなどのステージで呼び出されます。このメソッドは、常に、null以外のIResultオブジェクトを返します。ポリシーの実行のステージの詳細は、リクエスト、レスポンスおよびフォルト・メッセージ・オブジェクトへのアクセスに関する項を参照してください。

3. IResult postExecute(IContext messageContext): ポリシー実行後に必要なタスクを実行します。

4. void destroy(): この破棄メソッドは、アプリケーションがシャットダウンを実行しているときに、Oracle WSMランタイムによって起動されます。アサーションのライフサイクルの終了時にクリーナとして起動されます。

1.3.5 カスタム・アサーションのタイプ

ポリシー・オブジェクト・モデルは、次の2つのタイプのアサーションを定義します。

- シンプル・アサーション

- 複数要素のシンプル・アサーション

1.3.5.1 シンプル・アサーション

シンプル・アサーションには、アサーション(単一の動作を定義)が1つしか含まれません。他のアサーションを含めることはできません。シンプル・アサーションは、Oracleが定義する拡張機能を除いて、ネストされた要素が含まれていないorg.w3c.dom.Elementにマップします。シンプル・アサーションのクラスは、oracle.wsm.policy.model.ISimpleAssertionクラスを拡張します。ISimpleOracleAssertionは、WS-PolicyアサーションのためにOracleが定義した拡張機能を提供します。

使用方法

シンプル・アサーション:

- Oracle拡張機能の要素の<orawsp:bindings>以外のネストされた要素を含めることはできません。

- 他のアサーションは含めることはできません。

- デフォルトのシリアライザおよびデシリアライザを使用します。

- デフォルトの実装クラスを使用します。

- 基本的なクラスのSimpleAssertionを拡張する必要があります。メソッドgetAssertionTypeは、新しいクラスを導入したときに適切な値を返す必要があります。

- 新しいクラスを導入したときにシリアライザとデシリアライザは不要です。

疑似スキーマ

バインディング要素しか含まれないシンプル・アサーションの疑似スキーマは次のとおりです。

<Assertion>
[ wsp:Optional="xsd:boolean" ]?
[ orawsp:Silent="xsd:boolean" ]?
[ orawsp:Enforced="xsd:boolean" ]?
[ orawsp:description="xsd:string" ]?
[ orawsp:category="xsd:string" ]?...>
<orawsp:bindings>?
</Assertion>

1.3.5.2 複数要素のシンプル・アサーション

複数要素のシンプル・アサーションは他のアサーションを含めることはできません。ただし、ネストされたXML要素を含むことがあります。複数要素のシンプル・アサーションは、ネストされた要素が含まれているorg.w3c.dom.ElementとOracleが定義する拡張機能要素にマップします。複数要素のシンプル・アサーションのクラスは、oracle.wsm.policy.model.IMultiElementSimpleAssertionクラスを拡張します。

使用方法

複数要素のシンプル・アサーション:

- Oracle拡張機能の要素の<orawsp:bindings>以外のネストされた要素を含むことがあります。

- 他のアサーションを含めることができず、ドメイン固有の仕様で定義されます。ドメイン固有のインターセクション・セマンティクスが定義されている場合のみ、ネストされたXML要素がインターセクションに参加します。

疑似スキーマ

複数要素のシンプル・アサーションはバインディング以外の要素を含むことがあります。疑似スキーマは次のとおりです。

<Assertion>
[ wsp:Optional="xsd:boolean" ]?
[ orawsp:Silent="xsd:boolean" ]?
[ orawsp:Enforced="xsd:boolean" ]?
[ orawsp:description="xsd:string" ]?
[ orawsp:category="xsd:string" ]?...>
<other-xml-elements>+
<orawsp:bindings>?
</Assertion>

2 カスタム・アサーションの作成

この章では、カスタム・アサーションを開発する方法について説明します。内容は、次のとおりです。

- ポリシーとアサーションのネーミング規則

- Webサービスのためのカスタム・アサーションの開発

- Webサービスのテスト

- カスタム・アサーションでのカスタム・クライアント・ポリシーの作成

2.1 ポリシーとアサーションのネーミング規則

ポリシー名はポリシー・コンテンツの名前属性によって指定されます。ポリシー名は、ポリシー・ストアに存在しないものであることが必要です。いったんポリシーをポリシー・ストアにインポートしたら、ポリシーの名前を編集できなくなります。ポリシー名を変更するには、ポリシーを コピー して別の名前を割り当てます。

『Oracle Fusion Middleware Oracle Fusion Middleware Webサービスのためのセキュリティおよび管理者ガイド』のポリシーの推奨ネーミング規則に関する項に記載されているポリシーのネーミング規則に従うことをお薦めします。同じ規則がアサーションのネーミングに使用されます。

2.2 Webサービスのためのカスタム・アサーションの開発

カスタム・アサーションを開発するには、次のファイルを作成する必要があります。

- カスタム・アサーション・エグゼキュータ: Javaクラスとその解析および強制ロジックを実装します。

- カスタム・ポリシー・ファイル: カスタム・アサーションのバインディングの定義と構成ができます。

- policy-config.xmlファイル: カスタム・ポリシー・ファイルを登録します。

次のファイルのいずれかのカスタム・アサーション・エグゼキュータを指定できます。

- カスタム・ポリシー・ファイル

- policy-config.xmlファイル

カスタム・アサーション・エグゼキュータとpolicy-config.xmlファイルをJARファイルとしてパッケージ化し、JARファイルをドメインのCLASSPATHで使用できるようにします。その後、必要に応じて、カスタム・ポリシー・ファイルをインポートしてWebサービスまたはクライアントに添付します。

次の項では、プロセスの各手順を説明します。

2.2.1 手順1: カスタム・アサーション・エグゼキュータの作成

カスタム・アサーション・エグゼキュータを作成し、ポリシー・アサーションのロジックを実行および検証します。カスタム・アサーション・エグゼキュータはoracle.wsm.policyengine.impl.AssertionExecutorを拡張する必要があります。

カスタム・アサーション・エグゼキュータを構築する際に、wsm-policy-core.jar、wsm-agent-core.jarおよびoracle.logging-utils_11.1.1.jarのJARファイル(それぞれ、oracle_common/modules/oracle.wsm.common_11.1.1、oracle_common/modules/oracle.wsm.agent.common_11.1.1およびoracle_common/moduleに存在)がCLASSPATHにあることを確認します。ファイルをクラスパスに追加します。

例2-1は、Webサービスに対するリクエストのIPアドレスを検証するために使用できるカスタム・アサーション・エグゼキュータの例です。リクエストのIPアドレスが無効の場合は、FAULT_FAILED_CHECK例外がスローされます。

独自のカスタム・アサーション・エグゼキュータを開発するために利用可能なAPIの詳細は、Oracle Web Services Manager Java APIリファレンスを参照してください。

例2-1 カスタム・アサーション・エグゼキュータの例

package sampleassertion;

import oracle.wsm.common.sdk.IContext;
import oracle.wsm.common.sdk.IMessageContext;
import oracle.wsm.common.sdk.IResult;
import oracle.wsm.common.sdk.Result;
import oracle.wsm.common.sdk.WSMException;
import oracle.wsm.policy.model.IAssertionBindings;
import oracle.wsm.policy.model.IConfig;
import oracle.wsm.policy.model.IPropertySet;
import oracle.wsm.policy.model.ISimpleOracleAssertion;
import oracle.wsm.policy.model.impl.SimpleAssertion;
import oracle.wsm.policyengine.impl.AssertionExecutor;

public class IpAssertionExecutor extends AssertionExecutor {
public IpAssertionExecutor() {
}
public void destroy() {
}

public void init(oracle.wsm.policy.model.IAssertion assertion,
oracle.wsm.policyengine.IExecutionContext econtext,
oracle.wsm.common.sdk.IContext context) {
this.assertion = assertion;
this.econtext = econtext;
}
public oracle.wsm.policyengine.IExecutionContext getExecutionContext() {
return this.econtext;
}
public boolean isAssertionEnabled() {
return ((ISimpleOracleAssertion)this.assertion).isEnforced();
}
public String getAssertionName() {
return this.assertion.getQName().toString();
}

/**
* @param context
* @return
*/
public IResult execute(IContext context) throws WSMException {
try {
IAssertionBindings bindings =
((SimpleAssertion)(this.assertion)).getBindings();
IConfig config = bindings.getConfigs().get(0);
IPropertySet propertyset = config.getPropertySets().get(0);
String valid_ips =
propertyset.getPropertyByName("valid_ips").getValue();
String ipAddr = ((IMessageContext)context).getRemoteAddr();
IResult result = new Result();
if (valid_ips != null && valid_ips.trim().length() > 0) {
String[] valid_ips_array = valid_ips.split(",");
boolean isPresent = false;
for (String valid_ip : valid_ips_array) {
if (ipAddr.equals(valid_ip.trim())) {
isPresent = true;
}
}
if (isPresent) {
result.setStatus(IResult.SUCCEEDED);
} else {
result.setStatus(IResult.FAILED);
result.setFault(new WSMException(WSMException.FAULT_FAILED_CHECK));
}
} else {
result.setStatus(IResult.SUCCEEDED);
}
return result;
} catch (Exception e) {
throw new WSMException(WSMException.FAULT_FAILED_CHECK, e);
}
}

public oracle.wsm.common.sdk.IResult postExecute(oracle.wsm.common.sdk.IContext p1) {
IResult result = new Result();
result.setStatus(IResult.SUCCEEDED);
return result;
}
}

2.2.2 手順2: カスタム・ポリシー・ファイルの作成

カスタム・ポリシー・ファイルを作成し、カスタム・アサーションのバインディングを定義して構成します。「カスタム・アサーションのスキーマ参照」で、カスタム・ポリシー・ファイルとカスタム・アサーションの作成に使用できるスキーマについて説明します。

次の例では、oracle/ip_assertion_policyカスタム・ポリシー・ファイルが定義されます。アサーションは、リクエストに対して有効なIPアドレスのカンマ区切りのリストを定義します。

例2-2 カスタム・ポリシー・ファイルの例

<?xml version = '1.0' encoding = 'UTF-8'?>

<wsp:Policy xmlns="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:orasp="http://schemas.oracle.com/ws/2006/01/securitypolicy"
orawsp:status="enabled"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" orawsp:category="security"
orawsp:attachTo="binding.server" wsu:Id="ip_assertion_policy"
xmlns:orawsp="http://schemas.oracle.com/ws/2006/01/policy"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
wsp:Name="oracle/ip_assertion_policy">
<orasp:ipAssertion orawsp:Silent="true" orawsp:Enforced="true"
orawsp:name="WSSecurity IpAssertion Validator" orawsp:category="security/authentication">
<orawsp:bindings>
<orawsp:Config orawsp:name="ipassertion" orawsp:configType="declarative">
<orawsp:PropertySet orawsp:name="valid_ips">
<orawsp:Property orawsp:name="valid_ips" orawsp:type="string"
orawsp:contentType="constant">
<orawsp:Value>127.0.0.1,192.168.1.1</orawsp:Value>
</orawsp:Property>
</orawsp:PropertySet>
</orawsp:Config>
</orawsp:bindings>
</orasp:ipAssertion>
</wsp:Policy>

2.2.3 手順3: カスタム・アサーション・エグゼキュータの指定

次のファイルのいずれかのカスタム・アサーション・エグゼキュータを指定します。

- カスタム・ポリシー・ファイル

- policy-config.xmlファイル

カスタム・ポリシー・ファイルでのカスタム・アサーション・エグゼキュータの指定

例2-3に示すように、カスタム・ポリシーを更新してorawsp:Implementation要素のカスタム・エグゼキュータ情報を指定します。

例2-3 カスタム・ポリシー・ファイルでのカスタム・アサーション・エグゼキュータの指定

<?xml version = '1.0' encoding = 'UTF-8'?><wsp:Policy
xmlns="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:orasp="http://schemas.oracle.com/ws/2006/01/securitypolicy"
orawsp:status="enabled"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" orawsp:category="security"
orawsp:attachTo="binding.server" wsu:Id="ip_assertion_policy"
xmlns:orawsp="http://schemas.oracle.com/ws/2006/01/policy"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
wsp:Name="oracle/ip_assertion_policy">
<orasp:ipAssertion orawsp:Silent="true" orawsp:Enforced="true"
orawsp:name="WSSecurity IpAsertion validator" orawsp:category="security/authentication">
<orawsp:bindings>
<orawsp:Implementation>sampleassertion.IpAssertionExecutor</orawsp:Implementation>
<orawsp:Config orawsp:name="ipassertion" orawsp:configType="declarative">
<orawsp:PropertySet orawsp:name="valid_ips">
<orawsp:Property orawsp:name="valid_ips" orawsp:type="string"
orawsp:contentType="constant">
<orawsp:Value>140.87.6.143,10.178.93.107</orawsp:Value>
</orawsp:Property>
</orawsp:PropertySet>
</orawsp:Config>
</orawsp:bindings>
</orasp:ipAssertion>
</wsp:Policy>

policy-config.xmlファイルでのカスタム・アサーション・エグゼキュータの指定

新しいアサーションのエントリを定義してそのカスタム・アサーション・エグゼキュータと関連付ける、policy-config.xmlファイルを作成します。

policy-config.xmlファイルのフォーマットは、例2-4に示されています。

例2-4 policy-config.xmlファイルのフォーマット

<?xml version="1.0" encoding="UTF-8"?>
<policy-config>
<policy-model-config>
<entry>
<key namespace="namespace" element-name="elementname"/>
<executor-classname>assertionclass</executor-classname>
</entry>
</policy-model-config>
</policy-config>

表2-1に、key要素の属性をリストしています。

表2-1 key要素の属性

属性

説明

namespace

ポリシーのネームスペース。この値は、カスタム・ポリシー・ファイルで定義したネームスペース(手順1)と一致する必要があります。

例2-2では、ネームスペースは次のように<wsp:Policy>タグの一部として定義されます。

xmlns:orasp="http://schemas.oracle.com/ws/2006/01/securitypolicy"

element-name

要素の名前。この値は、カスタム・ポリシー・ファイルで定義したアサーション名(手順1)と一致する必要があります。

例2-2では、要素名ipAssertionは次のタグで定義されています。

<orasp:ipAssertion orawsp:Silent="true" orawsp:Enforced="true" orawsp:name="WSSecurity
IpAssertion Validator" orawsp:category="security/authentication">

例2-5に、ipAssertionポリシーのエントリを含むpolicy-config.xmlファイルの例を示します。

例2-5 policy-config.xmlファイルの例

<?xml version="1.0" encoding="UTF-8"?>
<policy-config>
<policy-model-config>
<entry>
<key namespace="http://schemas.oracle.com/ws/2006/01/securitypolicy"
element-name="ipAssertion"/>
<executor-classname>sampleassertion.IpAssertionExecutor</executor-classname>
</entry>
</policy-model-config>
</policy-config>

注意:
policy-config.xmlファイルはサーバーのクラスパスにある必要があります。手順4: JARファイルの作成に関する項に説明されているように、このファイルをカスタム・エグゼキュータのjarファイルに追加することもできます。

2.2.4 手順4: JARファイルの作成

カスタム・アサーション・エグゼキュータとpolicy-config.xmlファイルを含むカスタム・アサーションJARファイルを作成します。JARファイルの生成には、Oracle JDeveloper、別のIDE、またはjarツールを使用できます。

2.2.5 手順5: カスタム・ポリシーのポリシー・ストアへの追加

次の各項で説明するように、Fusion Middleware ControlまたはWLSTを使用して、カスタム・ポリシーをポリシー・ストアに追加します。

Fusion Middleware Controlの使用

カスタム・ポリシーをWebサービスに添付できるようにするには、『Oracle Fusion Middleware Webサービスのためのセキュリティおよび管理者ガイド』のWebサービス・ポリシーのインポートに関する項の手順に従ってカスタム・ポリシーをインポートする必要があります。

WLSTの使用

WebLogic Scripting Tool (WLST)コマンドを使用して、カスタム・ポリシーをインポートします。詳細は、『Oracle Fusion Middleware Webサービスのためのセキュリティおよび管理者ガイド』のポリシーの移行に関する項を参照してください。

2.2.6 手順6: カスタム・アサーションのデプロイ

カスタム・アサーションJARファイルをCLASSPATHに追加するには、次の手順を実行します。

1. WebLogic Serverを停止します。
WebLogic Serverの停止の詳細は、『Oracle WebLogic Serverサーバーの起動と停止の管理』を参照してください。

2. 手順4で作成したカスタム・アサーションJARファイルを、$DOMAIN_HOME/libディレクトリにコピーします。

3. WebLogic Serverを再起動します。
WebLogic Serverの再起動の詳細は、『Oracle WebLogic Serverサーバーの起動と停止の管理』を参照してください。

2.2.7 手順7: Webサービスへのカスタム・ポリシーの添付

『Oracle WebLogic Server WebLogic Webサービスの紹介』のWebLogic Webサービスの実装のロードマップに関する項に説明されている情報に従って、Webサービスを作成します。

次の項で説明されているように、Webサービスにカスタム・ポリシーを添付します。

Fusion Middleware Controlの使用

『Oracle Fusion Middleware Webサービスのためのセキュリティおよび管理者ガイド』のFusion Middleware ControlによるWebサービスへのポリシーの添付に関する項に説明されているように、Fusion Middleware Controlを使用してWebサービスにカスタム・ポリシーを添付します。

WebLogic管理コンソールの使用

Oracle WebLogic Server管理コンソールのヘルプのWebサービスへのWS-Policyファイルの添付に関する項に説明されているように、WebLogic管理コンソールを使用してWebサービスにカスタム・ポリシーを添付します。

WLSTの使用

『Oracle Fusion Middleware Webサービスのためのセキュリティおよび管理者ガイド』のWLSTによるWebサービスへのポリシーの添付に関する項に説明されているように、WLSTを使用してWebサービスにカスタム・ポリシーを添付します。

JDeveloperの使用

JDeveloperのオンライン・ヘルプのカスタムWebサービス・ポリシーの使用に関する項に説明されているように、JDeveloperを使用してWebサービスにカスタム・ポリシーを添付します。

2.2.8 手順8: クライアントの生成

clientgenを使用して、Webサービスのクライアント・プロキシを作成します。

詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のclientgen Antタスクを使用したクライアント・アーティファクトの生成に関する項を参照してください。

2.3 Webサービスのテスト

Fusion Middleware ControlのWebサービスのテスト・ページを使用して、Webサービスをデプロイしないで、Webサービスの操作をテストし、結果を表示します。詳細は、『Oracle Fusion Middleware Web Servicesセキュリティおよび管理者ガイド』のWebサービスのテストに関する項を参照してください。

2.4 カスタム・アサーションでのカスタム・クライアント・ポリシーの作成

Webサービスのカスタム・アサーションの開発に関する項で作成したWebサービスのカスタム・アサーションから、クライアント・ポリシーを作成します。クライアント・ポリシーの生成の詳細は、『Oracle Fusion Middleware Web Servicesセキュリティおよび管理者ガイド』のクライアント・ポリシーの生成に関する項を参照してください。

3 サンプル・カスタム・アサーションによる手順

この章では、サンプル・カスタム・アサーションについて説明します。内容は、次のとおりです。

- 概要

- IPアドレス検証のカスタム・アサーションのサンプル

- 暗号化と復号化のカスタム・アサーションのサンプル

- 認証のカスタム・アサーションのサンプル

3.1 概要

この章では、サンプル・カスタム・アサーションについて説明し、各カスタム・アサーションのサンプル・コードを示します。各サンプルには、サンプルに実装されている主な機能について説明するセクションも含まれています。

3.2 IPアドレス検証のカスタム・アサーションのサンプル

IP検証のカスタム・アサーションのサンプルでは、Webサービスに対して実行されたリクエストが、有効なIPアドレスから実行されたかどうかを検証します。カスタム・ポリシー・アサーションでは、有効なIPアドレスをカンマ区切りの値のリストとして含めることができます。他のIPアドレスから来る任意のリクエストは、FAILED_CHECKレスポンスになります。

次の各項では、カスタム・アサーションをコード化する方法を示すサンプルを説明します。

- 3.2.1 コード・サンプル

- 3.2.2 このサンプルの実行

3.2.1 コード・サンプル

この項では、カスタム・アサーションを作成および実装する次のサンプル・コードを示します。

- サンプル・カスタム・アサーション・エグゼキュータ

- サンプル・ポリシー・ファイル

- サンプルのpolicy-config.xml

- サンプルWebサービス

- サンプルJSEクライアント

サンプル・カスタム・アサーション・エグゼキュータ

例3-1は、IPアドレスを検証するために使用できるサンプルのカスタム・アサーション・エグゼキュータを示しています。

例3-1 サンプルのカスタム・アサーション・エグゼキュータ

package sampleassertion;

import oracle.wsm.common.sdk.IContext;
import oracle.wsm.common.sdk.IMessageContext;
import oracle.wsm.common.sdk.IResult;
import oracle.wsm.common.sdk.Result;
import oracle.wsm.common.sdk.WSMException;
import oracle.wsm.policy.model.IAssertionBindings;
import oracle.wsm.policy.model.IConfig;
import oracle.wsm.policy.model.IPropertySet;
import oracle.wsm.policy.model.ISimpleOracleAssertion;
import oracle.wsm.policy.model.impl.SimpleAssertion;
import oracle.wsm.policyengine.impl.AssertionExecutor;

public class IpAssertionExecutor extends AssertionExecutor {

public IpAssertionExecutor() {
}

public void destroy() {
}

public void init(oracle.wsm.policy.model.IAssertion assertion,
oracle.wsm.policyengine.IExecutionContext econtext,
oracle.wsm.common.sdk.IContext context) {
this.assertion = assertion;
this.econtext = econtext;
}

public oracle.wsm.policyengine.IExecutionContext getExecutionContext() {
return this.econtext;
}

public boolean isAssertionEnabled() {
return ((ISimpleOracleAssertion)this.assertion).isEnforced();
}

public String getAssertionName() {
return this.assertion.getQName().toString();
}

/**
* @param context
* @return
*/
public IResult execute(IContext context) throws WSMException {
try {
oracle.wsm.common.sdk.IMessageContext.STAGE stage =
((oracle.wsm.common.sdk.IMessageContext)context).getStage();

if (stage  == IMessageContext.STAGE.request)  {

IAssertionBindings bindings =
((SimpleAssertion)(this.assertion)).getBindings();
IConfig config = bindings.getConfigs().get(0);
IPropertySet propertyset = config.getPropertySets().get(0);
String valid_ips = propertyset.getPropertyByName("valid_
ips").getValue();
String ipAddr = ((IMessageContext)context).getRemoteAddr();
IResult result = new Result();

if (valid_ips != null && valid_ips.trim().length() > 0) {
String[] valid_ips_array = valid_ips.split(",");
boolean isPresent = false;
for (String valid_ip : valid_ips_array) {
if (ipAddr.equals(valid_ip.trim())) {
isPresent = true;
}
}
if (isPresent) {
result.setStatus(IResult.SUCCEEDED);
} else {
result.setStatus(IResult.FAILED);
result.setFault(new WSMException(WSMException.FAULT_FAILED
_CHECK));
}
} else {
result.setStatus(IResult.SUCCEEDED);
}
return result;
}
} catch (Exception e) {
throw new WSMException(WSMException.FAULT_FAILED_CHECK, e);
}
}

public oracle.wsm.common.sdk.IResult
postExecute(oracle.wsm.common.sdk.IContext p1) {
IResult result = new Result();
result.setStatus(IResult.SUCCEEDED);
return result;
}
}

サンプル・ポリシー・ファイル

例 3-2は、サンプル・ポリシー・ファイルを示しています。

例3-2 サンプル・ポリシー・ファイル

<?xml version = '1.0' encoding = 'UTF-8'?>
<wsp:Policy xmlns="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:orasp="http://schemas.oracle.com/ws/2006/01/securitypolicy"
orawsp:status="enabled"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-uti
lity-1.0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" orawsp:category="security"
orawsp:attachTo="binding.server" wsu:Id="ip_assertion_policy"
xmlns:orawsp="http://schemas.oracle.com/ws/2006/01/policy"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
wsp:Name="oracle/ip_assertion_policy">
<orasp:ipAssertion orawsp:Silent="true" orawsp:Enforced="true"
orawsp:name="WSSecurity IpAsertion validator"
orawsp:category="security/authentication">
<orawsp:bindings>
<orawsp:Config orawsp:name="ipassertion"
orawsp:configType="declarative">
<orawsp:PropertySet orawsp:name="valid_ips">
<orawsp:Property orawsp:name="valid_ips"
orawsp:type="string" orawsp:contentType="constant">
<orawsp:Value>140.87.6.143,10.178.93.107</orawsp:Value>
</orawsp:Property>
</orawsp:PropertySet>
</orawsp:Config>
</orawsp:bindings>
</orasp:ipAssertion>
</wsp:Policy>

サンプルのpolicy-config.xml

例3-3は、policy-config.xmlファイルを使用して、カスタム・アサーション・エグゼキュータを指定する方法を示しています。手順3: カスタム・アサーション・エグゼキュータの指定に関する項で説明されているように、カスタム・ポリシーを使用して、カスタム・ポリシー・エグゼキュータを指定することもできます。

例3-3 サンプルのpolicy-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<policy-config>
<policy-model-config>
<entry>
<key namespace="http://schemas.oracle.com/ws/2006/01/securitypolicy"
element-name="ipAssertion"/>
<executor-classname>sampleassertion.IpAssertionExecutor</executor-classname>
</entry>
</policy-model-config>
</policy-config>

サンプルのWebサービス

例3-4は、サンプルのWebサービスを示しています。手順7: Webサービスへのカスタム・ポリシーの添付に関する項で説明されているように、カスタム・アサーションをWebサービスに添付できます。

例3-4 サンプルのWebサービス

package project1;
import javax.jws.WebService;
import weblogic.wsee.jws.jaxws.owsm.SecurityPolicies;
@WebService
@SecurityPolicy(uri="policy:oracle/ip_assertion_policy")
public class Class1 {
public Class1() {
super();
}

public String echo1() {
return "one";
}
}

サンプルのJSEクライアント

例3-5は、例3-4のWebサービスから生成されたJSEクライアントのサンプルです。

例3-5 サンプルのJSEクライアント

package project1;
import javax.xml.ws.WebServiceRef;

public class Class1PortClient
{
@WebServiceRef
private static Class1Service class1Service;
public static void main(String [] args)
{
class1Service = new Class1Service();
Class1 port = class1Service.getClass1Port();
// Add your code to call the desired methods.

System.out.println(port.echo1());
}
}

3.2.2 このサンプルの実行

IP検証のカスタム・アサーションのサンプルを使用するには、次の手順を実行します。

1. 3.2.1 コード・サンプルに関する項で説明されているように、サンプル・コードを使用して、カスタム・アサーションとカスタム・アサーション・エグゼキュータを作成します。これらのサンプルは次の主な機能を示しています。

- カスタム・アサーションにIPアドレスの有効な値を指定します。

<orawsp:PropertySet orawsp:name="valid_ips">
<orawsp:Property orawsp:name="valid_ips" orawsp:type="string"
orawsp:contentType="constant">
<orawsp:Value>140.87.6.143,10.178.93.107</orawsp:Value>
</orawsp:Property>
</orawsp:PropertySet>

詳細は、カスタム・アサーションへのパラメータの入力に関する項を参照してください。

- カスタム・アサーション・エグゼキュータの実行ステージを表示します。

oracle.wsm.common.sdk.IMessageContext.STAGE stage =
((oracle.wsm.common.sdk.IMessageContext)context).getStage()

詳細は、リクエスト、レスポンスおよびフォルト・メッセージ・オブジェクトへのアクセスに関する項を参照してください。

- カスタム・アサーション・エグゼキュータからIPアドレスにアクセスします。

IConfig config = bindings.getConfigs().get(0);
IPropertySet propertyset = config.getPropertySets().get(0);
String valid_ips = propertyset.getPropertyByName("valid_ips").getValue();

詳細は、カスタム・アサーションへのパラメータの入力に関する項を参照してください。

- コンテキスト・プロパティ・リモート・アドレスにアクセスします。

String ipAddr = ((IMessageContext)context).getRemoteAddr();

詳細は、Oracle WSMコンテキスト・プロパティへのアクセスに関する項を参照してください。

- 失敗した場合、リクエストの実行が失敗した原因となるフォルトを設定します。

result.setFault(new WSMException(WSMException.FAULT_FAILED_CHECK));

詳細は、カスタム・アサーションでの例外処理に関する項を参照してください。

2. 手順4: JARファイルの作成に関する項で説明されているように、JARファイルを作成します。

3. 手順5: カスタム・ポリシーのポリシー・ストアへの追加に関する項で説明されているように、カスタム・ポリシーをポリシー・ストアに追加します。

4. 手順6: カスタム・アサーションのデプロイに関する項で説明されているように、クラスパスを更新します。

5. 手順7: Webサービスへのカスタム・ポリシーの添付に関する項で説明されているメソッドのいずれかに従って、カスタム・ポリシーをWebサービスに添付します。

3.3 暗号化と復号化のカスタム・アサーションのサンプル

このサンプルでは、カスタム・アサーションのセットを使用して、インバウンド・メッセージからデータを暗号化し、コンソール、監査証跡またはログから読み取られないようにします。暗号化されたデータは、データのアクセスを必要とするダウンストリーム・サービスのアウトバウンド・メッセージのために復号化されます。

次の各項では、カスタム・アサーションをコード化する方法を示すサンプルを提示し、サンプルを詳細に説明します。

- 3.3.1 コード・サンプル

- 3.3.2 サンプルの実行

3.3.1 コード・サンプル

この項では、カスタム・アサーションを作成および実装する次のサンプル・コードを示します。

- サンプル・カスタム・アサーション・エグゼキュータ

- サンプルのインバウンド暗号化クラス

- サンプルのアウトバウンド復号化クラス

- 暗号化のためのサンプル・ポリシー・ファイル

- 復号化のためのサンプル・ポリシー・ファイル

- 暗号化されたメッセージを受信するためのサンプル・コンポジット

- サンプルの外部サービス・コンポジット

サンプル・カスタム・アサーション・エグゼキュータ

例3-6は、データの暗号化と復号化に使用するサンプルのカスタム・アサーション・エグゼキュータを示しています。実装の詳細は、サンプルの実行"に関する項を参照してください。

例3-6 サンプルのカスタム・アサーション・エグゼキュータ

package owsm.custom.soa;

import java.util.HashMap;
import java.util.Iterator;

import javax.xml.namespace.NamespaceContext;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import oracle.wsm.common.sdk.IContext;
import oracle.wsm.policy.model.IAssertion;
import oracle.wsm.policyengine.IExecutionContext;
import oracle.wsm.policyengine.impl.AssertionExecutor;

import org.w3c.dom.Element;
import org.w3c.dom.Node;

/**
* A base class for OWSM custom assertions that specific classes can extend. It
* contains common code and variables used accross all custom assertions.
*
* All custom assertions must extend the AssertionExecutor class.
*/
public abstract class CustomAssertion
extends AssertionExecutor
{

protected final static String PROP_DEBUG = "debugFlag";

protected final static String DEBUG_START =
"===========================================================>>>";
protected final static String DEBUG_END =
"<<<===========================================================";

protected IAssertion mAssertion = null;
protected IExecutionContext mEcontext = null;
protected oracle.wsm.common.sdk.IContext mIcontext = null;

/**
* A tag or text to display when printing debug information to identify the
* content.
*/
protected String mTag;

/**
* Constructor
*/
public CustomAssertion(String tag)
{
super();
mTag = tag;
} // CustomAssertion()

/**
* Implemented from parent class
*/
public void init(IAssertion iAssertion,
IExecutionContext iExecutionContext,
IContext iContext)
{
mAssertion = iAssertion;
mEcontext = iExecutionContext;
mIcontext = iContext;
//IAssertionBindings bindings = ((SimpleAssertion)

(mAssertion)).getBindings();
} // init()
/**
* Implemented from parent class
*/
public void destroy()
{
// Nothing to do.
} // destroy()

/**
* A utility method for extracting the node specified by <code>xpathStr</code>
* (with namespaces defined by <code>namespaces</code>) from
*<code>payload</code>
*
* This method will print an stack trace if their is an exception. If you want
*to
* return the exception instead then modify the method appropriately.
*
* @param payload the payload
* @param namespaces the namespaces referenced by <code>xpathStr</code>
* @param xpathStr an XPath query defining how to extract a node from
*<code>payload</code>
* @return
*/
public static Node getDataNode(Element payload, final HashMap<String, String>

namespaces, String xpathStr)
{
Node node = null;

try
{
// Create a namespace context based on the namespaces passed in.
//
NamespaceContext ctx = new NamespaceContext()
{
public String getNamespaceURI(String prefix)
{
return namespaces.get(prefix);
}
// Dummy implementation - not used
public Iterator getPrefixes(String val)
{
return null;
}
// Dummy implemenation - not used
public String getPrefix(String uri)
{
return null;
}
};
XPathFactory xpathFact = XPathFactory.newInstance();
XPath xpath = xpathFact.newXPath();
xpath.setNamespaceContext(ctx);
node = (Node)xpath.evaluate(xpathStr, payload, XPathConstants.NODE);
}
catch (XPathExpressionException ex)
{
ex.printStackTrace();
return null;
}

return node;
} // getDataNode()

}

サンプルのインバウンド暗号化クラス

例3-7は、インバウンド・メッセージの要素を暗号化するためのサンプル・カスタム・アサーション・エグゼキュータを示しています。

例3-7 サンプルのインバウンド暗号化クラス

package owsm.custom.soa;

import java.util.HashMap;

import javax.xml.soap.SOAPBody;

import oracle.wsm.common.sdk.IContext;
import oracle.wsm.common.sdk.IMessageContext;
import oracle.wsm.common.sdk.IResult;
import oracle.wsm.common.sdk.Result;
import oracle.wsm.common.sdk.SOAPBindingMessageContext;
import oracle.wsm.common.sdk.WSMException;
import oracle.wsm.policy.model.IAssertionBindings;
import oracle.wsm.policy.model.IConfig;
import oracle.wsm.policy.model.IProperty;
import oracle.wsm.policy.model.IPropertySet;
import oracle.wsm.policy.model.impl.SimpleAssertion;

import oracle.xml.parser.v2.XMLElement;

import org.w3c.dom.Node;

/**
* A custom assertion class for encrypting an element of an inbound message.
*/
public class InboundEncryptor
extends CustomAssertion
{
/**
* Constructor
*/
public InboundEncryptor()
{
super("[InboundEncryptor] ");
} // InboundEncryptor()

/**
* Process an inbound message for the given invocation context
*
* @param iContext the invocation context for a specific message
* @return the result of any actions taken. It can return a success message or
*         a fault with an exception message
*/
public IResult execute(IContext iContext)
{
// Create the result that's going be populate with success or failure
// depending on what happens.
//
IResult result = new Result();

// Specify whether we are in debug mode or not. If true then debug statements
// will be printed to the log file.
// This can be set to true in the OWSM policy assertion.
//
boolean debug = false;

try
{
// Get the property set which contains properties defined in the OWSM
// policy assertion.
//
IAssertionBindings bindings = ((SimpleAssertion)
(mAssertion)).getBindings();
IConfig config = bindings.getConfigs().get(0);
IPropertySet propertyset = config.getPropertySets().get(0);

// Now that we have the property set, let's check it for the specific
// properties we care about.
//

// Check for the debug flag property.
//
IProperty debugProp = propertyset.getPropertyByName(PROP_DEBUG);
if (debugProp != null)
{
String debugStr = debugProp.getValue();
debug = Boolean.valueOf(debugStr).booleanValue();
}
if (debug)
{
System.out.println(mTag+DEBUG_START);
System.out.println(mTag+this.getClass().getSimpleName()+".execute()
Starting...");
System.out.println(mTag+"In debug mode");
}

// Check for the stage. We only care about the request stage for this
// implementation.
//
IMessageContext.STAGE stage = ((IMessageContext) iContext).getStage();
if (debug) System.out.println(mTag+"stage="+stage);
if (stage != IMessageContext.STAGE.request)
{
result.setStatus(IResult.SUCCEEDED);
if (debug)
{
System.out.println(mTag+"Nothing to process in this stage. Returning");
System.out.println(mTag+DEBUG_END);
}
return result;
}
// Get the encryption key, which is a property on the assertion.
//
String key = propertyset.getPropertyByName("encryption_key").getValue();
if (debug) System.out.println(mTag+"key=[" + key + "]");
if (key == null || key.trim().length() == 0)
{
result.setStatus(IResult.FAILED);
result.setFault(new WSMException("Invalid key"));
if (debug)
{
System.out.println(mTag+"Invalid key");
System.out.println(mTag+DEBUG_END);
}
return result;
}
// As as point of interest, you can get the service URL. This could be used
// by this class to know which service this message is bound for, and
//therefore
// which XPath expression to use.
// In this example no such logic is needed as we only have one servcie
// to worry about.
//
if (debug)
{
String serviceURL = ((IMessageContext) iContext).getServiceURL();
System.out.println(mTag+"serviceURL=[" + serviceURL+"]");
}
// Get the message.
//
SOAPBindingMessageContext soapbindingmessagecontext =
(SOAPBindingMessageContext) iContext;
javax.xml.soap.SOAPMessage soapMessage =
soapbindingmessagecontext.getRequestMessage();
SOAPBody soapElem = soapMessage.getSOAPBody();
if (debug)
{
System.out.println(mTag+"----- Start ORIGINAL inbound message -----");
((XMLElement) soapElem).print(System.out);
System.out.println(mTag+"-----  End ORIGINAL inbound message  -----");
}
// Create the XPath to reference the element which is to be encrypted.
//
String xpathStr =
"/soap:Envelope/soap:Body/ns1:process/ns1:order/ns1:ccNum";
// Build up a namespace list for any namespaces referenced by the
// XPath expression. This will be the basis for a namespace context
// created later.
//
final HashMap<String, String> namespaces = new HashMap<String, String>();
namespaces.put("soap", "http://schemas.xmlsoap.org/soap/envelope/");
namespaces.put("ns1", "http://xmlns.oracle.com/CustomEncryption
_jws/CustomEncryptionComposite/ProcessCustomer");

// Extract the node that should be encrypted.
//
Node inputNode = getDataNode(soapElem, namespaces, xpathStr);
if (inputNode == null)
{
// Something went wrong, but getDataNode() would've printed out a
//stacktrace
// so print out a debug statement and exit.
//
result.setStatus(IResult.FAILED);
result.setFault(new WSMException("Cannot find node with XPath expression:
"+xpathStr));
if (debug)
{
System.out.println(mTag+"Cannot find node with XPath expression:
"+xpathStr);
System.out.println(mTag+DEBUG_END);
}
return result;
}

// Extract the string value of the element to be encrypted.
//
String inputValue = inputNode.getTextContent();

// Get an instance of EncDec and perform the actual encryption.
//
EncDec ed = EncDec.getInstance();
String encryptedInput = ed.encryptStrToStr(inputValue, key);
if (debug) System.out.println(mTag+"result of encryption=[" + encryptedInput
+ "]");
// Replace the value of the node with the encrypted value.
//
try
{
inputNode.setTextContent(encryptedInput);
}
catch (Exception ex)
{
ex.printStackTrace();
}
if (debug)
{
System.out.println(mTag+"----- Start MODIFIED inbound message -----");
((XMLElement) soapElem).print(System.out);
System.out.println(mTag+"-----  End MODIFIED inbound message  -----");
}
// Set a happy result.
//
result.setStatus(IResult.SUCCEEDED);
}
catch (Exception e)
{
// This is a general or catchall handler.
//
result.setStatus(IResult.FAILED);
result.setFault(new WSMException(WSMException.FAULTCODE_QNAME_FAILED_CHECK,
e));
if (debug) System.out.println(this.getClass().getName()+": ERROR: Got an
exception somewhere...");
}

if (debug) System.out.println(mTag+DEBUG_END);
return result;

} // execute()

} // InboundEncryptor

サンプルのアウトバウンド復号化クラス

例3-8は、アウトバウンド・メッセージの要素を復号化するためのサンプル・カスタム・アサーション・エグゼキュータを示しています。

例3-8 サンプルのアウトバウンド復号化クラス

package owsm.custom.soa;

import java.util.HashMap;

import javax.xml.soap.SOAPBody;

import oracle.wsm.common.sdk.IContext;
import oracle.wsm.common.sdk.IMessageContext;
import oracle.wsm.common.sdk.IResult;
import oracle.wsm.common.sdk.Result;
import oracle.wsm.common.sdk.SOAPBindingMessageContext;
import oracle.wsm.common.sdk.WSMException;
import oracle.wsm.policy.model.IAssertionBindings;
import oracle.wsm.policy.model.IConfig;
import oracle.wsm.policy.model.IProperty;
import oracle.wsm.policy.model.IPropertySet;
import oracle.wsm.policy.model.impl.SimpleAssertion;

import oracle.xml.parser.v2.XMLElement;

import org.w3c.dom.Node;

/**
* A custom assertion class for decrypting an element of an outbound message.
*/
public class OutboundDecryptor
extends CustomAssertion
{

/**
* Constructor
*/
public OutboundDecryptor()
{
super("[OutboundDecryptor] ");
} // OutboundDecryptor()

//////////////////////////////////////////////////////////////////////////////

/**
* Process an outbound message for the given invocation context
*
* @param iContext the invocation context for a specific message
* @return the result of any actions taken. It can return a success message or
*         a fault with an exception message
*/
public IResult execute(IContext iContext)
{
// Create the result that's going be populate with success or failure
// depending on what happens.
//
IResult result = new Result();

// Specify whether we are in debug mode or not. If true then debug statements
// will be printed to the log file.
// This can be set to true in the OWSM policy assertion.
//
boolean debug = false;

try
{
// Get the property set which contains properties defined in the OWSM
// policy assertion.
//
IAssertionBindings bindings = ((SimpleAssertion)
(mAssertion)).getBindings();
IConfig config = bindings.getConfigs().get(0);
IPropertySet propertyset = config.getPropertySets().get(0);

// Now that we have the property set, let's check it for the specific
// properties we care about.
//

// Check for the debug flag property.
//
IProperty debugProp = propertyset.getPropertyByName(PROP_DEBUG);
if (debugProp != null)
{
String debugStr = debugProp.getValue();
debug = Boolean.valueOf(debugStr).booleanValue();
}
if (debug)
{
System.out.println(mTag+DEBUG_START);
System.out.println(mTag+this.getClass().getSimpleName()+".execute()
Starting...");
System.out.println(mTag+"In debug mode");
}

// Check for the stage. We only care about the request stage for this
// implementation.
//
IMessageContext.STAGE stage = ((IMessageContext) iContext).getStage();
if (debug) System.out.println(mTag+"stage="+stage);
if (stage != IMessageContext.STAGE.request)
{
result.setStatus(IResult.SUCCEEDED);
if (debug)
{
System.out.println(mTag+"Nothing to process in this stage. Returning");
System.out.println(mTag+DEBUG_END);
}
return result;
}
// Get the encryption key, which is a property on the assertion.
//
String key = propertyset.getPropertyByName("decryption_key").getValue();
if (debug) System.out.println(mTag+"key=[" + key + "]");
if (key == null || key.trim().length() == 0)
{
result.setStatus(IResult.FAILED);
result.setFault(new WSMException("Invalid key"));
if (debug)
{
System.out.println(mTag+"Invalid key");
System.out.println(mTag+DEBUG_END);
}
return result;
}
String serviceURL = ((IMessageContext) iContext).getServiceURL();
if (debug) System.out.println(mTag+"serviceURL=[" + serviceURL+"]");
// Get the message.
//
SOAPBindingMessageContext soapbindingmessagecontext =

(SOAPBindingMessageContext) iContext;
javax.xml.soap.SOAPMessage soapMessage =
soapbindingmessagecontext.getRequestMessage();
SOAPBody soapElem = soapMessage.getSOAPBody();

// As as point of interest, you can get the service URL. This could be used
// by this class to know which service this message is bound for, and
//therefore
// which XPath expression to use.
// In this example no such logic is needed as we only have one servcie
// to worry about.
//
if (debug)
{
System.out.println(mTag+"----- Start ORIGINAL inbound message -----");
((XMLElement) soapElem).print(System.out);
System.out.println(mTag+"-----  End ORIGINAL inbound message  -----");
}
// Create the XPath to reference the element which is to be encrypted.
//
String xpathStr = "/soap:Envelope/soap:Body/ns1:process/ns1:ccNum";

// Build up a namespace list for any namespaces referenced by the
// XPath expression. This will be the basis for a namespace context
// created later.
//
final HashMap<String, String> namespaces = new HashMap<String, String>();
namespaces.put("soap", "http://schemas.xmlsoap.org/soap/envelope/");
namespaces.put("ns1", "http://xmlns.oracle.com/CustomEncryption
_jws/CustomEncryptionExternalService/ExternalServiceBpel");

// Extract the node that should be encrypted.
//
Node inputNode = getDataNode(soapElem, namespaces, xpathStr);
if (inputNode == null)
{
// Something went wrong, but getDataNode() would've printed out a
//stacktrace
// so print out a debug statement and exit.
//
result.setStatus(IResult.FAILED);
result.setFault(new WSMException("Cannot find node with XPath expression:
"+xpathStr));
if (debug)
{
System.out.println(mTag+"Cannot find node with XPath expression:
"+xpathStr);
System.out.println(mTag+DEBUG_END);
}
return result;
}

// Extract the string value of the element to be encrypted.
//
String inputValue = inputNode.getTextContent();

// Get an instance of EncDec and perform the actual encryption.
//
EncDec ed = EncDec.getInstance();
String decryptedInput = ed.decryptStrToStr(inputValue, key);
if (debug) System.out.println(mTag+"result of decryption=[" + decryptedInput
+ "]");
// Replace the value of the node with the encrypted value.
//
try
{
inputNode.setTextContent(decryptedInput);
}
catch (Exception ex)
{
ex.printStackTrace();
}
if (debug)
{
System.out.println(mTag+"----- Start MODIFIED inbound message -----");
((XMLElement) soapElem).print(System.out);
System.out.println(mTag+"-----  End MODIFIED inbound message  -----");
}
// Set a happy result.
//
result.setStatus(IResult.SUCCEEDED);
}
catch (Exception e)
{
// This is a general or catchall handler.
//
result.setStatus(IResult.FAILED);
result.setFault(new WSMException(WSMException.FAULTCODE_QNAME_FAILED_CHECK,
e));
if (debug) System.out.println(this.getClass().getName()+": ERROR: Got an
exception somewhere...");
}

if (debug) System.out.println(mTag+DEBUG_END);
return result;

} // execute()

} // OutboundDecryptor

暗号化のためのサンプル・ポリシー・ファイル

例3-9は、暗号化のためのサンプルのカスタム・アサーション・エグゼキュータを示しています。

例3-9 暗号化のためのサンプル・ポリシー・ファイル

<orasp:Assertion xmlns:orawsp="http://schemas.oracle.com/ws/2006/01/policy"
orawsp:Id="soa_encryption_template"
orawsp:attachTo="generic" orawsp:category="security"
orawsp:description="Custom Encryption of payload"
orawsp:displayName="Custom Encryption"
orawsp:name="custom/soa_encryption"
xmlns:custom="http://schemas.oracle.com/ws/soa/custom">
<custom:custom-executor orawsp:Enforced="true" orawsp:Silent="false"
orawsp:category="security/custom"
orawsp:name="WSSecurity_Custom_Assertion">
<orawsp:bindings>
<orawsp:Implementation>owsm.custom.soa.InboundEncryptor</orawsp:Implementation>
<orawsp:Config orawsp:configType="declarative" orawsp:name="encrypt_soa">
<orawsp:PropertySet orawsp:name="encrypt">
<orawsp:Property orawsp:contentType="constant"
orawsp:name="encryption_key" orawsp:type="string">
<orawsp:Value>MySecretKey</orawsp:Value>
</orawsp:Property>
<orawsp:Property orawsp:contentType="constant"
orawsp:name="debugFlag" orawsp:type="string">
<orawsp:Value>true</orawsp:Value>
</orawsp:Property>
</orawsp:PropertySet>
</orawsp:Config>
</orawsp:bindings>
</custom:custom-executor>
</orasp:Assertion>

復号化のためのサンプル・ポリシー・ファイル

例3-10は、復号化のためのサンプルのカスタム・アサーションを示しています。

例3-10 復号化のためのサンプル・ポリシー・ファイル

<orasp:Assertion xmlns:orawsp="http://schemas.oracle.com/ws/2006/01/policy"
orawsp:Id="soa_decryption_template"
orawsp:attachTo="binding.client"
orawsp:category="security"
orawsp:description="Custom Decryption of payload"
orawsp:displayName="Custom Decryption"
orawsp:name="custom/soa_decryption"
xmlns:custom="http://schemas.oracle.com/ws/soa/custom">
<custom:custom-executor orawsp:Enforced="true" orawsp:Silent="false"
orawsp:category="security/custom"
orawsp:name="WSSecurity Custom Assertion">
<orawsp:bindings>
<orawsp:Implementation>owsm.custom.soa.OutboundDecryptor</orawsp:Implementation>
<orawsp:Config orawsp:configType="declarative" orawsp:name="encrypt_soa">
<orawsp:PropertySet orawsp:name="decrypt">
<orawsp:Property orawsp:contentType="constant"
orawsp:name="decryption_key" orawsp:type="string">
<orawsp:Value>MySecretKey</orawsp:Value>
</orawsp:Property>
<orawsp:Property orawsp:contentType="constant"
orawsp:name="debugFlag" orawsp:type="string">
<orawsp:Value>true</orawsp:Value>
</orawsp:Property>
</orawsp:PropertySet>
</orawsp:Config>
</orawsp:bindings>
</custom:custom-executor>
</orasp:Assertion>

暗号化されたメッセージを受信するためのサンプル・コンポジット

次のサンプルは、暗号化された値を受信したことを示すために使用されるBPELプロセスを含むコンポジット・アプリケーションです。

例3-11 サンプル・コンポジット

<?xml version="1.0" encoding="UTF-8" ?>
<!-- Generated by Oracle SOA Modeler version 1.0 at [5/10/10 9:33 AM]. -->
<composite name="CustomEncryptionComposite"
revision="1.0"
label="2010-05-10_09-33-01_807"
mode="active"
state="on"
xmlns="http://xmlns.oracle.com/sca/1.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:orawsp="http://schemas.oracle.com/ws/2006/01/policy"
xmlns:ui="http://xmlns.oracle.com/soa/designer/">
<import namespace="http://xmlns.oracle.com/CustomEncryption
_jws/CustomEncryptionComposite/ProcessCustomer"
location="ProcessCustomer.wsdl" importType="wsdl"/>
<import namespace="http://xmlns.oracle.com/CustomEncryption
_jws/CustomEncryptionExternalService/ExternalServiceBpel"
location="ExternalServiceBpel.wsdl" importType="wsdl"/>
<service name="processcustomer_client_ep"
ui:wsdlLocation="ProcessCustomer.wsdl">
<interface.wsdl interface="http://xmlns.oracle.com/CustomEncryption
_jws/CustomEncryptionComposite/ProcessCustomer#wsdl.interface(ProcessCustomer)"/>
<binding.ws port="http://xmlns.oracle.com/CustomEncryption
_jws/CustomEncryptionComposite/ProcessCustomer#wsdl.endpoint(processcustomer
_client_ep/ProcessCustomer_pt)">
<wsp:PolicyReference URI="SOA/CustomEncryption" orawsp:category="security"
orawsp:status="enabled"/>
</binding.ws>
</service>
<component name="ProcessCustomer">
<implementation.bpel src="ProcessCustomer.bpel"/>
</component>
<reference name="ExternalSvc" ui:wsdlLocation="ExternalServiceBpel.wsdl">
<interface.wsdl interface="http://xmlns.oracle.com/CustomEncryption
_jws/CustomEncryptionExternalService/ExternalServiceBpel#wsdl.interface(ExternalSe
rviceBpel)"/>
<binding.ws port="http://xmlns.oracle.com/CustomEncryption
_jws/CustomEncryptionExternalService/ExternalServiceBpel#wsdl.endpoint(externalser
vicebpel_client_ep/ExternalServiceBpel_pt)"
location="externalservicebpel_client_ep.wsdl"
soapVersion="1.1">
<wsp:PolicyReference URI="SOA/CustomDecryption" orawsp:category="security"
orawsp:status="enabled"/>
<property name="weblogic.wsee.wsat.transaction.flowOption"
type="xs:string" many="false">WSDLDriven</property>
</binding.ws>
</reference>
<wire>
<source.uri>processcustomer_client_ep</source.uri>
<target.uri>ProcessCustomer/processcustomer_client</target.uri>
</wire>
<wire>
<source.uri>ProcessCustomer/ExternalSvc</source.uri>
<target.uri>ExternalSvc</target.uri>
</wire>
</composite>

サンプルの外部サービス・コンポジット

次のサンプルは、呼び出されている外部サービスを示し、復号化された値を受信したことを示すために使用されるコンポジット・アプリケーションです。

例3-12 サンプルの外部サービス・コンポジット

<?xml version="1.0" encoding="UTF-8" ?>
<!-- Generated by Oracle SOA Modeler version 1.0 at [5/10/10 9:41 AM]. -->
<composite name="CustomEncryptionExternalService"
revision="1.0"
label="2010-05-10_09-41-00_810"
mode="active"
state="on"
xmlns="http://xmlns.oracle.com/sca/1.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:orawsp="http://schemas.oracle.com/ws/2006/01/policy"
xmlns:ui="http://xmlns.oracle.com/soa/designer/">
<import namespace="http://xmlns.oracle.com/CustomEncryption
_jws/CustomEncryptionExternalService/ExternalServiceBpel"
location="ExternalServiceBpel.wsdl" importType="wsdl"/>
<service name="externalservicebpel_client_ep"
ui:wsdlLocation="ExternalServiceBpel.wsdl">
<interface.wsdl interface="http://xmlns.oracle.com/CustomEncryption
_jws/CustomEncryptionExternalService/ExternalServiceBpel#wsdl.interface(ExternalSe
rviceBpel)"/>
<binding.ws port="http://xmlns.oracle.com/CustomEncryption
_jws/CustomEncryptionExternalService/ExternalServiceBpel#wsdl.endpoint(externalser
vicebpel_client_ep/ExternalServiceBpel_pt)"/>
</service>
<component name="ExternalServiceBpel">
<implementation.bpel src="ExternalServiceBpel.bpel"/>
</component>
<wire>
<source.uri>externalservicebpel_client_ep</source.uri>
<target.uri>ExternalServiceBpel/externalservicebpel_client</target.uri>
</wire>
</composite>

3.3.2 サンプルの実行

暗号化と復号化のサンプルを使用するには、次の手順を実行します。

1. コード・サンプルに関する項で説明されているように、サンプル・コードを使用して、ポリシー・ファイルとカスタム・アサーション・エグゼキュータを作成します。これらのサンプルは次の主な機能を示しています。

- 暗号化カスタム・アサーションの暗号化プロパティ・セットのプロパティencryption_keyとdebugFlagを指定します。

<orawsp:PropertySet orawsp:name="encrypt">
<orawsp:Property orawsp:contentType="constant"
orawsp:name="encryption_key"
orawsp:type="string">
<orawsp:Value>MySecretKey</orawsp:Value>
</orawsp:Property>
<orawsp:Property orawsp:contentType="constant"
orawsp:name="debugFlag" orawsp:type="string">
<orawsp:Value>true</orawsp:Value>
</orawsp:Property>
</orawsp:PropertySet>

詳細は、カスタム・アサーションへのパラメータの入力に関する項を参照してください。

- 復号化カスタム・アサーションの復号化プロパティ・セットのプロパティdecryption_keyとdebugFlagを指定します。

<orawsp:PropertySet orawsp:name="decrypt">
<orawsp:Property orawsp:contentType="constant"
orawsp:name="decryption_key"
orawsp:type="string">
<orawsp:Value>MySecretKey</orawsp:Value>
</orawsp:Property>
<orawsp:Property orawsp:contentType="constant"
orawsp:name="debugFlag" orawsp:type="string">
<orawsp:Value>true</orawsp:Value>
</orawsp:Property>
</orawsp:PropertySet>

詳細は、カスタム・アサーションへのパラメータの入力に関する項を参照してください。

- カスタム・アサーション・クラスから、定義済のネームスペースを含むXPath式で指定されたノードを抽出します。

NamespaceContext ctx = new NamespaceContext()
{
public String getNamespaceURI(String prefix)
{
return namespaces.get(prefix);
}
// Dummy implementation - not used
public Iterator getPrefixes(String val)
{
return null;
}
// Dummy implemenation - not used
public String getPrefix(String uri)
{
return null;
}
};
XPathFactory xpathFact = XPathFactory.newInstance();
XPath xpath = xpathFact.newXPath();
xpath.setNamespaceContext(ctx);

node = (Node)xpath.evaluate(xpathStr, payload, XPathConstants.NODE);
}

詳細は、XPathによるメッセージのパーツへのアクセスに関する項を参照してください。

2. 手順4: JARファイルの作成に関する項で説明されているように、JARファイルを作成します。

3. 手順5: カスタム・ポリシーのポリシー・ストアへの追加に関する項で説明されているように、カスタム・ポリシーをポリシー・ストアに追加します。

4. 手順6: カスタム・アサーションのデプロイに関する項で説明されているように、クラスパスを更新します。

5. 手順7: Webサービスへのカスタム・ポリシーの添付に関する項で説明されているメソッドのいずれかに従って、カスタム・ポリシーをWebサービスに添付します。

3.4 認証のカスタム・アサーションのサンプル

認証カスタム・アサーションのサンプルは、WebLogic認証プロバイダを使用してユーザーを認証するために使用されます。資格証明(ユーザー名とパスワード)は着信メッセージから読み取られ、カスタム・ログイン・モジュールを使用して、WebLogic認証プロバイダに対して認証されます。

次の各項では、カスタム・アサーションをコード化する方法を示すサンプルを提示し、サンプルを詳細に説明します。

- 3.4.1 コード・サンプル

- 3.4.2 サンプルの実行

3.4.1 コード・サンプル

この項では、カスタム・アサーションを作成および実装する次のサンプル・コードを示します。

- サンプル・カスタム・アサーション・エグゼキュータ

- サンプル・ポリシー・ファイル

- サンプル認証ファイル

サンプル・カスタム・アサーション・エグゼキュータ

例3-13は、カスタム・ログイン・モジュールを起動して認証を実行するサンプル・エグゼキュータを示しています。

例3-13 サンプルのカスタム・アサーション・エグゼキュータ

package sampleAssertion;
/**
* <Description>
* <p>
* CustomAuthExecutor class. This class is invoked for custom_auth_policy
* This class expects that wss_username_token_client_policy is attached to the
* calling client
* This class fetches credentials from incoming SOAP message and performs
* authentication against a configured login module as specified by the Login
* Config file.
* </p>
* </Description>
*
*/
import java.util.Iterator;

import javax.security.auth.Subject;
import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPHeaderElement;
import javax.xml.soap.SOAPMessage;

import oracle.wsm.common.sdk.IContext;
import oracle.wsm.common.sdk.IMessageContext;
import oracle.wsm.common.sdk.IResult;
import oracle.wsm.common.sdk.Result;
import oracle.wsm.common.sdk.SOAPBindingMessageContext;
import oracle.wsm.common.sdk.WSMException;
import oracle.wsm.policy.model.IAssertion;
import oracle.wsm.policy.model.ISimpleOracleAssertion;
import oracle.wsm.policyengine.impl.AssertionExecutor;

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class CustomAuthExecutor extends AssertionExecutor {

public void init(IAssertion assertion,
oracle.wsm.policyengine.IExecutionContext econtext,
oracle.wsm.common.sdk.IContext context) {
this.assertion = assertion;
this.econtext = econtext;
}

public oracle.wsm.policyengine.IExecutionContext getExecutionContext() {
return this.econtext;
}

public boolean isAssertionEnabled() {
return ((ISimpleOracleAssertion) this.assertion).isEnforced();
}

public String getAssertionName() {
return this.assertion.getQName().toString();
}

/**
* <p>
* This method is invoked for each request/response.
* This method retrieves credentials from incoming soap message and
* authenticates
* them against a configured login module
* </p>
* @param context
* @return IResult
* @exception WSMException
*/
@Override
public IResult execute(IContext context) throws WSMException {
oracle.wsm.common.sdk.IMessageContext.STAGE stage = ((oracle.wsm.common.sdk.IMessageContext) context)
.getStage();
IResult result = new Result();

if (stage == IMessageContext.STAGE.request) {
try {
SOAPBindingMessageContext soapMsgCtxt= (SOAPBindingMessageContext)
context;
//Intercepts the incoming SOAP message
SOAPMessage soapMessage = soapMsgCtxt.getRequestMessage();

MyCallbackHandler callbackhandler = new MyCallbackHandler();

//initialize CallbackHandler instance which is passed to
//LoginModule implementation
initializeCallbackHandler(callbackhandler, soapMessage);

//In order to authenticate a user, you first need a
//javax.security.auth.login.LoginContext.
/**

* Following parameters are passed to LoginContext
* 1. name - LoginContext uses the name as the index into the JAAS
* login configuration file to determine which LoginModules should
* be used. Such an entry specifies the class(es) that
* implement the desired underlying authentication
* technology(ies). The class(es) must implement
*  the LoginModule interface, which is in the
* javax.security.auth.spi package.
* In our case CustomLoginModule refers to
* sampleAssertion.loginmodule.CustomLoginModule
*
* 2. Subject - the subject (javax.security.auth.Subject) to
* authenticate. LoginContext passes the Subject
* object to configured LoginModules so they may perform
* additional authentication and update the Subject.
*
* 3. CallbackHandler instance -
* javax.security.auth.callback.CallbackHandler  object is used by
* LoginModules to
* communicate with the user. LoginContext passes the
* CallbackHandler object to configured LoginModules
*  so they may communicate with the user. An application
* typically provides its own CallbackHandler implementation.
*
**/

// Obtain a LoginContext, needed for authentication.
// Tell it to use the LoginModule implementation
// specified by the entry named "CustomLoginModule" in the
// JAAS login configuration file and to also use the
// specified CallbackHandler.
Subject subject = new Subject();
LoginContext lc = new LoginContext("CustomLoginModule", subject,
callbackhandler);

/**Once the caller has instantiated a LoginContext, it invokes the
* login method to authenticate a Subject
* The LoginContext instantiates a new empty
* javax.security.auth.Subject object (which represents the user or
* service being
* authenticated).
* The LoginContext constructs the configured LoginModule (in our
* case CustomLoginModule) and initializes it with this new Subject
* and
* MyCallbackHandler.
* The SampleLoginModule will utilize the MyCallbackHandler to
* obtain the user name and password.
* If authentication is successful, the CustomLoginModule
* populates the Subject with a Principal representing the user.
*
**/
lc.login();

//authenticated Subject can be retrieved by calling the
// LoginContext's getSubject
//method
subject = lc.getSubject();

System.out.println("Authentication succeeded");

//sets result to succeeded if authentication succeeds
result.setStatus(IResult.SUCCEEDED);
} catch (LoginException e) {
//in case there is a failure in authentication sets result to
// failed state and
// throw Failed authentication exception
result.setStatus(IResult.FAILED);
throw new WSMException(
WSMException.FAULTCODE_QNAME_FAILED_AUTHENTICATION, e);
}
}

return result;
}

/**
* Retrieves credentials from incoming SOAP message and
* sets them into call back handler, which is than passed to
* Login module
* class
* via initialize(Subject, Callbackhandler,..) method of
*  LoginModule
* @param SOAPMessage
* @param callbackhandler
*
*/
private void initializeCallbackHandler(MyCallbackHandler callbackhandler,
SOAPMessage soapElement) {
try {
SOAPHeader header = soapElement.getSOAPPart().getEnvelope()
.getHeader();
SOAPHeaderElement hdrElem = null;
Iterator iter = header.examineAllHeaderElements();

while (iter.hasNext()) {
hdrElem = (SOAPHeaderElement) iter.next();
String localName = hdrElem.getLocalName();
NodeList headerNodeList = hdrElem.getChildNodes();

for (int i = 0; i < headerNodeList.getLength(); i++) {
Node kid = headerNodeList.item(i);
String kidName = kid.getLocalName();

if (kidName.equals("UsernameToken")) {
NodeList nodeList = kid.getChildNodes();

/**check if incoming SOAP message contains UsernameToken
*and retrieve credentials from it
* The user name and password are set into callbackhandler
* which are passed to Login module
* for authentication
**/
for (int j = 0; j < nodeList.getLength(); j++) {
String nodeName = nodeList.item(j).getLocalName();
String nodeValue = nodeList.item(j).getTextContent();

if (nodeName.equals("Username")) {
callbackhandler.setUserName(nodeValue);
}

if (nodeName.equals("Password")) {
callbackhandler.setPassword(nodeValue);
}
}

}
}
}

} catch (SOAPException se) {
System.out.println("caught SOAPException: " + se.getMessage());
}

}

/**
*Executes any task required after policy execution.
*
*/
@Override
public oracle.wsm.common.sdk.IResult postExecute(
oracle.wsm.common.sdk.IContext context) {
IResult result = new Result();
result.setStatus(IResult.SUCCEEDED);
return result;
}        @Override
public void destroy() {
}
}

サンプル・ポリシー・ファイル

例3-14は、例3-13に関する項で説明されているエグゼキュータを起動するカスタム・アサーションです。これは、WebLogic認証プロバイダに対してユーザーを認証するために使用されます。

例3-14 サンプル・ポリシー・ファイル

<?xml version = '1.0'?>
<wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:oralgp="http://schemas.oracle.com/ws/2006/01/loggingpolicy"
xmlns:orawsp="http://schemas.oracle.com/ws/2006/01/policy"
orawsp:provides="{http://docs.oasis-open.org/ns/opencsa/sca/200903}authentication,
{http://docs.oasis-open.org/ns/opencsa/sca/200903}clientAuthentication,
{http://docs.oasis-open.org/ns/opencsa/sca/200903}clientAuthentication.message,
{http://schemas.oracle.com/ws/2006/01/policy}token.usernamePassword"
orawsp:status="enabled" xmlns="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-uti
lity-1.0.xsd" wsu:Id="custom_auth_policy"
orawsp:displayName="i18n:oracle.wsm.resources.policydescription.PolicyDescription
Bundle_oracle/custom_auth_policy_PolyDispNameKey"
xmlns:orasp="http://schemas.oracle.com/ws/2006/01/securitypolicy"
orawsp:description="i18n:oracle.wsm.resources.policydescription.PolicyDescription
Bundle_oracle/custom_auth_policy_PolyDescKey" orawsp:attachTo="binding.server"
Name="oracle/custom_auth_policy"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" orawsp:category="security"
orawsp:local-optimization="off">
<orasp:custom-auth-assertion orawsp:Silent="false" orawsp:name="Custom auth"
orawsp:Enforced="true" orawsp:category="security/authentication">
<orawsp:bindings>
<orawsp:Implementation>sampleAssertion.CustomAuthExecutor</orawsp:Implementation>
</orawsp:bindings>
</orasp:custom-auth-assertion>
</wsp:Policy>

サンプル認証ファイル

次のコード・サンプルは認証の実装を示しています。

- 例3-15は、ユーザー認証を実行するために使用されるログイン・モジュールを指定するエントリが含まれているログイン構成ファイルを示しています。

- 例3-16は、例3-15のLoginConfigファイルで指定されているCustomLoginModuleクラスのサンプルです。これは、javax.security.auth.spi.LoginModuleを実装し、Weblogic認証プロバイダに対してユーザーを認証します。

- 例3-17は、javax.security.auth.spi.LoginModuleを実装するSimpleLoginModuleクラスのサンプルで、例示のためのものです。

- 例3-18は、CallbackHandlerクラスのサンプルで、javax.security.auth.callback.Callbackインタフェースを実装しています。

例3-15 サンプル構成ファイル

/** Login Configuration for the Sample Application
JAAS authentication is performed in a pluggable fashion, so Java applications can
remain independent from
underlying authentication technologies. Users can plugin there custom loginmodule
implementations which
can integrate with corresponding authentication provider.

The name for an entry in a login configuration file is the name that applications
use to refer to the entry when
they instantiate a LoginContext. The specified LoginModules (described below) are
used to control the authentication process.

As part of this sample we are using CustomLoginModule and SimpleLoginModule
1. CustomLoginModule - integrates with weblogic authentication provider
2. SimpleLoginModule - simply returns

You can also provide implementation of javax.security.auth.login.Configuration
interface
Refer http://download.oracle.com/javase/1.4.2/docs/api/javax/security/auth/login/Config
uration.html and
http://download.oracle.com/javase/1.4.2/docs/guide/security/jaas/tutorials/LoginC
onfigFile.html for more details.

**/

CustomLoginModule {
sampleAssertion.loginmodule.CustomLoginModule required debug=true;
};

SimpleLoginModule {
sampleAssertion.loginmodule.SimpleLoginModule required debug=true;
};

例3-16 javax.security.auth.spi.LoginModuleの実装のサンプル

package sampleAssertion.loginmodule;
/**
* <Description>
* <p>
* CustomLoginModule class implements the javax.security.auth.spi.LoginModule
* interface. CustomLoginModule class is specified
* by the login configuration file i.e Login.config file.
* This class authenticates user against weblogic authentication provider.
* If authentication is successful, the CustomLoginModule associate Principals and
* Credentials with the authenticated Subject
*
* Users can create there own custom login modules
* by implementing <code>javax.security.auth.spi.LoginModule</code> interface
* </p>
* </Description>
*
*/
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Map;

import javax.security.auth.Subject;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;

import weblogic.security.services.Authentication;

public class CustomLoginModule implements LoginModule
{
private Subject authenticatorSubject;
private CallbackHandler callbackHandler;
private boolean loginSucceeded;

/**
* Initialize this LoginModule.
*
* <p> This method is called by the <code>LoginContext</code> to initialize
* the <code>LoginModule</code> with the relevant information.
* <p>
*
* @param subject the - <code>javax.security.auth.Subject</code> to be
* authenticated.
*
* @param callbackHandler - instance of
* <code>javax.security.auth.callback.CallbackHandler</code>
*   the CallbackHandler object is used by LoginModules to retrieve the
* information set by the user
*   e.g user name / password.
*
* @param sharedState state shared with other configured LoginModules. <p>
*
* @param options options specified in the login Configuration for this
*  particular LoginModule.
*
**/
@Override
public void initialize(Subject subject, CallbackHandler callbackHandler,
Map<String, ?> sharedState, Map<String, ?> options)
{
this.authenticatorSubject = subject;
this.callbackHandler = callbackHandler;
}

@Override
/**
* Method to authenticate a <code>Subject</code>.
*
* <p> The implementation of this method authenticates
* a <code>Subject</code> using weblogic authentication provider
* <p>
*
* @exception LoginException if the authentication fails
*
* @return true if the authentication succeeded
*/
public boolean login() throws LoginException
{
/**authenticates user against weblogic authentication provider and sets
* loginSucceeded
* flag to true in case of successful authentication
*/
this.authenticatorSubject = authenticate(this.callbackHandler);
loginSucceeded = true;
return loginSucceeded;
}

/**
* authenticates using weblogic authentication provider
* @param CallbackHandler
* @return authenticated Subject
* @throws LoginException
*/
private Subject authenticate(CallbackHandler cbh) throws LoginException {
try {
return Authentication.login(cbh);
} catch (LoginException e) {
throw new LoginException("Authentication Failed"+e.getMessage());
}
}

@Override
/**
* Method to commit the authentication process.
*
* <p> This method is called if the LoginContext's
* overall authentication succeeded
* <p>
*
* @exception LoginException if the commit fails
*
* @return true if this method succeeded, or false if this
*          <code>LoginModule</code> should be ignored.
*/
public boolean commit() throws LoginException {
if (this.authenticatorSubject != null) {
addToSubject(this.authenticatorSubject);
return true;
} else {
return false;
}
}
/**
* Method to abort the authentication process.
*
* <p> This method is called if the LoginContext's
* overall authentication failed.
* <p>
*
* @exception LoginException if the abort fails
*
* @return true if this method succeeded, or false if this
*          <code>LoginModule</code> should be ignored.
*/
public boolean abort() throws LoginException {
return this.loginSucceeded && logout();
}

/**
* Method which logs out a <code>Subject</code>.
*
* <p>An implementation of this method might remove/destroy a Subject's
* Principals and Credentials.
* <p>
*
* @exception LoginException if the logout fails
*
* @return true if this method succeeded, or false if this
*          <code>LoginModule</code> should be ignored.
*/
public boolean logout() throws LoginException
{
if (this.authenticatorSubject != null) {
removeFromSubject(this.authenticatorSubject);
}
this.loginSucceeded = false;
return true;
}

/**
* associates relevant Principals and Credentials with the Subject located in
* the LoginModule
* @param Subject
*/
protected void addToSubject(final Subject sub) {
if (sub != null) {
AccessController.doPrivileged(new PrivilegedAction<Object>() {
public Object run() {

authenticatorSubject.getPrincipals().addAll(sub.getPrincipals());
authenticatorSubject.getPrivateCredentials().addAll(sub.getPrivateCredentials());
authenticatorSubject.getPublicCredentials().addAll(sub.getPublicCredentials());
return null;
}
});
}
}

/**
* removes Principals and Credentials from the subject
* @param Subject
*/
private void removeFromSubject(final Subject sub) {
if (sub != null) {
AccessController.doPrivileged(new PrivilegedAction<Object>() {
public Object run() {
authenticatorSubject.getPrincipals().removeAll(sub.getPrincipals());
authenticatorSubject.getPrivateCredentials().removeAll(sub.getPrivateCredentials(

));
authenticatorSubject.getPublicCredentials().removeAll(sub.getPublicCredentials());
return null;
}
});
}
}
}

例3-17 javax.security.auth.spi.LoginModuleの実装のサンプル

/**
* <Description>
* <p>
* SimpleLoginModule class implements the LoginModule interface. SimpleLoginModule
* class is specified
* by the login configuration file i.e Loginconfig file.
* This class simply returns true resulting in successful authentication.
*
* This class is shown for illustration purpose only, users can integrate it with
* there custom authentication provider
* </p>
* </Description>
*
*/
package sampleAssertion.loginmodule;

import java.util.Map;

import javax.security.auth.Subject;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;

public class SimpleLoginModule implements LoginModule {

@Override
public boolean abort() throws LoginException {
return false;
}

@Override
public boolean commit() throws LoginException {
return true;
}

@Override
public void initialize(Subject subject, CallbackHandler callbackHandler,
Map<String, ?> sharedState, Map<String, ?> options) {

}

@Override
/**
* This method simply returns true and results in successful authentication
* Users can integrate it using there custom authentication provider
*/
public boolean login() throws LoginException {
System.out.println("Inside SimpleLoginModule");
return true;
}

@Override
public boolean logout() throws LoginException {
return false;
}

}

例3-18 サンプル・コールバック・ハンドラ

package sampleAssertion;
/**
* <Description>
* <p>
* MyCallbackHandler class implements the
*  <code>javax.security.auth.callback.CallbackHandler </code> interface.
* An application implements its owm implementation of CallbackHandler.
* An instance of CallbackHandler is passed as an argument to the LoginContext
* instantiation.
* The LoginContext forwards the CallbackHandler directly to the underlying
* LoginModules
* so that they may interact with the application to retrieve specific
* authentication data,
* such as usernames and passwords.
* </p>
* </Description>
*
*/
import java.io.IOException;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;

public class MyCallbackHandler implements CallbackHandler {

private String userName = null;

private String password = null;

public void setUserName(String userName) {
this.userName = userName;
}

public void setPassword(String password) {
this.password = password;
}

@Override
/**
* sets user name and password into callback
*/
public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException {

for (int i = 0; i < callbacks.length; i++) {
Callback c = callbacks[i];
if (c instanceof NameCallback) {
((NameCallback) c).setName(this.userName);
} else if (c instanceof PasswordCallback) {
char[] password = this.password.toCharArray();
((PasswordCallback) c).setPassword(password);
} else {
throw new UnsupportedCallbackException(callbacks[i],
"Unrecognized Callback");
}
}

}

}

3.4.2 サンプルの実行

認証のカスタム・アサーションのサンプルを使用するには、次の手順を実行します。

1. 3.4.1 コード・サンプルに関する項で説明されているように、サンプル・コードを使用して、カスタム・アサーションとカスタム・アサーション・エグゼキュータを作成します。これらのサンプルは次の主な機能を示しています。

- カスタム・アサーション実装クラスを定義します。

<orawsp:bindings>
<orawsp:Implementation>sampleAssertion.CustomAuthExecutor
</orawsp:Implementation>
</orawsp:bindings>

詳細は、orawsp:Implementationに関する項を参照してください。

- カスタム・アサーション・エグゼキュータの実行ステージを表示します。

oracle.wsm.common.sdk.IMessageContext.STAGE stage =
((oracle.wsm.common.sdk.IMessageContext) context).getStage();

詳細は、リクエスト、レスポンスおよびフォルト・メッセージ・オブジェクトへのアクセスに関する項を参照してください。

- ユーザーを認証するには、まず、javax.security.auth.login.LoginContextが必要です。LoginContextを取得します。JAAS構成ファイルのCustomLoginModuleという名前のエントリによって指定されたLoginModule実装を使用して、次のように指定されたCallbackHandlerを使用します。

Subject subject = new Subject();
LoginContext lc = new LoginContext("CustomLoginModule", subject,
callbackhandler);

呼出し側がLoginContextをインスタンス化すると、ログイン・メソッドを起動してサブジェクトを認証します。認証が正常終了した場合、CustomLoginModuleはユーザーを表すプリンシパルをサブジェクトに移入します。

詳細は、http://download.oracle.com/javase/1.5.0/docs/guide/security/jgss/tutorials/index.htmlを参照してください。

initializerCallbackHandler (例3-13)を使用して、着信SOAPメッセージにUsernameTokenが含まれているかどうかを,チェックし、着信SOAPメッセージから資格証明を取得し、ログイン・モジュール・クラスにその資格証明を渡します。

- 成功した場合、結果に成功を設定します。

result.setStatus(IResult.SUCCEEDED);

- 失敗した場合、リクエストの実行が失敗した原因となるフォルトを設定します。

result.setStatus(IResult.FAILED);
throw new WSMException(
WSMException.FAULTCODE_QNAME_FAILED_AUTHENTICATION, e);

詳細は、カスタム・アサーションでの例外処理に関する項を参照してください。

2. 手順4: JARファイルの作成に関する項で説明されているように、JARファイルを作成します。

3. 手順5: カスタム・ポリシーのポリシー・ストアへの追加に関する項で説明されているように、カスタム・ポリシーをポリシー・ストアに追加します。

4. 手順6: カスタム・アサーションのデプロイに関する項で説明されているように、クラスパスを更新します。

5. 手順7: Webサービスへのカスタム・ポリシーの添付に関する項で説明されているメソッドのいずれかに従って、カスタム・ポリシーをWebサービスに添付します。

6. Webサービスのクライアントを作成します。このサンプル・カスタム・ポリシーは、クライアント側でwss_username_token_client_policyを使用します。wss_username_token_client_policyをクライアントに添付します。

7. サンプル認証ファイルに関する項で説明されているように、構成ファイル、および認証を実装するクラス・ファイルを作成します。構成ファイルの詳細は、http://download.oracle.com/javase/1.5.0/docs/guide/security/jgss/tutorials/index.htmlのJAAS APIを参照してください。

8. 例3-15で作成したログイン構成ファイルを指定します。次のいずれかの方法でファイルを指定できます。

- WebLogic Serverを起動するために使用するスクリプトを編集し、javaコマンドの後に次のオプションを追加後、サーバーを再起動します。
-Djava.security.auth.login.config==<LoginConfigファイルのパス>

- Javaセキュリティ・プロパティ・ファイルは、<JAVA_HOME>/lib/security/java.securityという名前のファイルにあります。<JAVA_HOME>はJDKがインストールされたディレクトリを指しています。このファイルでは、"login.configuration.provider"セキュリティ・プロパティをログイン構成ファイルの完全修飾名に変更します。

9. クライアントからリクエストを起動します。クライアントに設定されたユーザー名とパスワードは、Weblogic認証プロバイダと統合している設定済のログイン・モジュールに対して認証されます。

4 カスタム・アサーションの高度な機能の実装

Oracle Web Services Manager Java APIリファレンスでは、カスタム・アサーションに高度な機能を実装するために使用するパッケージ、インタフェースおよびメソッドを指定します。この章では、APIを使用して一部の共通の機能を実装する方法について説明します。この章では、APIの使用および例外処理について説明します。内容は、次のとおりです。

- カスタム・アサーションへのパラメータの入力

- Oracle WSMコンテキスト・プロパティへのアクセス

- リクエスト、レスポンスおよびフォルト・メッセージ・オブジェクトへのアクセス

- XPathによるメッセージのパーツへのアクセス

- SSLのコンテナで使用される証明書へのアクセス

- トランスポート・プロパティへのアクセス

- CSFキーへのアクセス

- カスタム・アサーションでの例外処理

4.1 カスタム・アサーションへのパラメータの入力

次のインタフェースおよびメソッドを使用して、カスタム・アサーションにパラメータを入力できます。

- IAssertionBindings

- IConfig

- IPropertySet

- getBindings

- getConfigs

- getPropertySets

- getPropertyByName

- getValue

カスタム・アサーションにパラメータを入力するには、次の手順を実行します。

1. カスタム・アサーション内部に、パラメータをプロパティとして指定します。この例では、valid_ipsという名前が付いたorawsp:PropertySetがプロパティのグループを定義します。orawsp:Property要素は単一のプロパティを定義します。orawsp:Valueではプロパティの有効な値のリストを定義します。

<orawsp:PropertySet orawsp:name="valid_ips">
<orawsp:Property orawsp:name="valid_ips" orawsp:type="string"
orawsp:contentType="constant">
<orawsp:Value>140.87.6.143,10.178.93.107</orawsp:Value>
</orawsp:Property>
</orawsp:PropertySet>

2. 対応するポリシーのカスタム・エグゼキュータ内部のパラメータにアクセスします。たとえば、カスタム・アサーションのExecutorクラスの実行メソッドの次のコードは、プロパティvalid_ipsにアクセスします。

IAssertionBindings bindings =
((SimpleAssertion)(this.assertion)).getBindings();
IConfig config = bindings.getConfigs().get(0);
IPropertySet propertyset = config.getPropertySets().get(0);
String valid_ips = propertyset.getPropertyByName("valid_ips").getValue();

4.2 Oracle WSMコンテキスト・プロパティへのアクセス

MessageContextインタフェースを使用して、Oracle WSMコンテキスト・プロパティにアクセスします。

次のインタフェースおよびメソッドを使用して、カスタム・アサーションへのパラメータにアクセスします。

- IMessageContext

- getServiceURL

- getProperty

- getAllProperty

Oracle WSMコンテキスト・プロパティにアクセスするには、次の手順を実行します。

1. カスタム・アサーション・エグゼキュータ内部のOracle WSMコンテキスト・プロパティにアクセスするには、IMessageContextインタフェースを使用します。次に例を示します。

IMessageContext messagecontext = (IMessageContext) context;
messagecontext.getServiceURL();

2. カスタム・アサーション・エグゼキュータ内部にある特定のプロパティの値にアクセスするには、IMessageContextインタフェースを使用します。次に例を示します。
messagecontext.getProperty("<property name>");

3. カスタム・アサーション・エグゼキュータ内部から実行中に使用されるすべてのプロパティにアクセスするには、IMessageContextインタフェースを使用します。次に例を示します。
msgContextProperties = messagecontext.getAllProperties();

4.3 リクエスト、レスポンスおよびフォルト・メッセージ・オブジェクトへのアクセス

Oracle WSMカスタム・セキュリティ・アサーションには、リクエスト、レスポンスおよびフォルトの3つのステージがあります。

- クライアントがリクエストを実行し、そのリクエストがリクエスト先に配信中であるときに、リクエスト・ステージが発生します。

- リクエスト先がメッセージを処理し、レスポンスを返しているときに、レスポンス・ステージが発生します。

- フォルトの場合に、フォルト・ステージが発生します。

コンテキスト情報(ステージやメッセージなど)はコンテキスト・プロパティを使用して渡され、IMessageContextインタフェースによって取得されます。次のインタフェースとメソッドは、コンテンツ・プロパティにアクセスするために使用します。

- IMessageContext

- getStage

- getRequestMessage

- getResponseMessage

リクエスト、レスポンスおよびフォルトのメッセージやステージにアクセスするには、次の手順を実行します。

1. ステージにアクセスするには、カスタム・アサーション・エグゼキュータ内で次のコードを使用します。

IMessageContext.STAGE stage = ((IMessageContext) iContext).getStage();
if (stage == IMessageContext.STAGE.request) {
//handle request
}

if (stage == IMessageContext.STAGE.response) {
//handle response
}

if (stage == IMessageContext.STAGE.fault) {
//handle fault conditions
}

2. SOAPリクエスト・メッセージを取得するには、次の例に示すように、同じコンテキストのoracle.wsm.common.sdk.IMessageContextを使用します。

oracle.wsm.common.sdk.SOAPBindingMessageContext soapMsgCtxt=
(oracle.wsm.common.sdk.SOAPBindingMessageContext) context;
javax.xml.soap.SOAPMessage soapMessage = soapMsgCtxt.getRequestMessage();

3. SOAPレスポンス・メッセージを取得するには、次の例に示すように、同じコンテキストのoracle.wsm.common.sdk.IMessageContextを使用します。

oracle.wsm.common.sdk.SOAPBindingMessageContext soapMsgCtxt=
(oracle.wsm.common.sdk.SOAPBindingMessageContext) context;
javax.xml.soap.SOAPMessage soapMessage = soapMsgCtxt.getResponseMessage ();

4.4 XPathによるメッセージのパーツへのアクセス

カスタム・ポリシー・エグゼキュータ内のXPath式を使用して、SOAPメッセージのパーツにアクセスできます。

次のSOAPメッセージ例では、ノードarg0の値はjohnです。

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header/>
<S:Body>
<ns2:echo xmlns:ns2="http://project1/">
<arg0>john</arg0>
</ns2:echo>
</S:Body>
</S:Envelope>

XPathには、要素、属性、テキスト、ネームスペース、処理の指示、コメントおよびドキュメント・ノードの7種類のノードがあります。XPathでは、パス式を使用してXMLドキュメントのノードを選択します。表4-1は、XPath式の例を示しています。

表 4-1 XPath式の例

式

説明

/S:Envelope

ルート要素S:Envelopeから選択します。

/S:Envelope/S:Body

S:Envelopeの子であるすべてのS:Body要素を選択します。

//S:Body

ドキュメント内のどこにあっても、すべてのS:Body要素を選択します。

たとえば、ノードarg0の値にアクセスするには、前述のSOAPメッセージのarg()のXPath式は次のように定義されます。

//xpath expression that will be used to identify the node arg0
String xpathStr = "/S:Envelope/S:Body/ns2:echo/arg0";

XPath式が参照する任意のネームスペースのためのネームスペースを定義し、これらをネームスペース・コンテキストに追加します。次に例を示します。

final DefaultNamespaceContext nsContext = new DefaultNamespaceContext();
nsContext.addEntry("S", "http://schemas.xmlsoap.org/soap/envelope/");
nsContext.addEntry("ns2", "http://project1/");

XPathFactory xpathFact = XPathFactory.newInstance();
XPath xpath = xpathFact.newXPath();
xpath.setNamespaceContext(nsContext);

評価メソッドを使用して、ノードの値を取得します。次に例を示します。

//This will return node arg0 from SOAP message, here soapElement is
// org.w3c.dom.Elemet  representation of SOAP message
org.w3c.dom.Node inputNode = (Node)xpath.evaluate(xpathStr, soapElement,
XPathConstants.NODE);

4.5 SSLのコンテナで使用される証明書へのアクセス

SSLの証明書を取得するには、次の手順を実行します。

1. 次の例に示すように、同じコンテキストのoracle.wsm.common.sdk.IMessageContextを使用して、SOAPレスポンス・メッセージを取得します。

oracle.wsm.common.sdk.SOAPBindingMessageContext soapMsgCtxt=
(oracle.wsm.common.sdk.SOAPBindingMessageContext) context;

2. HttpServletRequestインタフェースを使用して、サーブレット・リクエスト情報を取得します。

javax.servlet.http.HttpServletRequest request =
(javax.servlet.http.HttpServletRequest)
soapMsgCtxt.getTransportObject(ITransportContext.HTTP_SERVLETREQUEST_OBJ_
NAME);

3. X.509証明書の属性にアクセスします。次に例を示します。

X509Certificate[] certificates = (X509Certificate[])
request.getAttribute(oracle.wsm.security.util.SecurityConstants.SSL_PEER_
CERTIFICATES);

注意:
javax.servlet.http.HttpServletRequestインタフェースを使用するには、JARファイルmodules/javax.servlet_1.0.0.0_2-5.jarをクラスパスに含める必要があります。

4.6 トランスポート・プロパティへのアクセス

HTTPリクエストおよびレスポンスなどのトランスポート・オブジェクトにアクセスするには、次の手順を実行します。

1. 次の例に示すように、同じコンテキストのoracle.wsm.common.sdk.IMessageContextを使用して、SOAPレスポンス・メッセージを取得します。

oracle.wsm.common.sdk.SOAPBindingMessageContext soapMsgCtxt=
(oracle.wsm.common.sdk.SOAPBindingMessageContext) context;

2. HttpServletRequestインタフェースを使用して、次の例に示すように、HTTPサーブレットのサーブレット・リクエスト情報を取得します。

//to retrieve http servlet request object
HttpServletRequest request = (HttpServletRequest) soapMsgCtxt
.getTransportObject(ITransportContext.HTTP_SERVLETREQUEST_OBJ_
NAME);

3. HttpServletRequestインタフェースを使用して、次の例に示すように、HTTPサーブレットのサーブレット・レスポンス情報を取得します。

//to retrieve http servlet response object
HttpServletResponse response = (HttpServletResponse) soapMsgCtxt
.getTransportObject(ITransportContext.HTTP_SERVLETRESPONSE_OBJ_
NAME);

注意:
javax.servlet.http.HttpServletRequestインタフェースを使用するには、JARファイルmodules/javax.servlet_1.0.0.0_2-5.jarをクラスパスに含める必要があります。

4.7 CSFキーへのアクセス

資格証明ストア・フレームワーク(CSF)を使用して、資格証明を安全に管理し、資格証明を保存、取得および維持できます。

CSFを構成するには、次の手順を実行します。

1. ps-config.xmlでCSFを構成します。
WLSTを使用した資格証明ストアの構成の詳細は、『Oracle WebLogic Server WebLogic Webサービスの保護』のWLSTを使用した資格情報ストアの構成に関する項を参照してください。

2. カスタム・アサーション・エグゼキュータ内部のCSFからCSFキーを追加、更新または取得できます。例4-1および例4-2では、資格証明ストアからCSFキーにアクセスするために使用できるサンプル・コードを示しています。

例4-1 CSFキーへのアクセス

final String mapName = "oracle.wsm.security";
final csfKey = "user.credentials";
final oracle.security.jps.service.credstore.PasswordCredential userCreds =
getCredentialsFromCSF(mapName, csfKey);

if (userCreds != null) {
System.out.println("name:"+ userCreds.getName());
System.out.println("name:"+ new String(userCreds.getPassword()));
}

例4-2 getCredentialsFromCSFメソッド

private static oracle.security.jps.service.credstore.PasswordCredential
getCredentialsFromCSF(
final String mapName, final String csfKey) {
oracle.security.jps.service.credstore.PasswordCredential
passwordCredential = null;
try {
if (csfKey != null) {
final oracle.security.jps.service.credstore.CredentialStore credStore
= getCredStore();
if (credStore != null) {
passwordCredential = (oracle.security.jps.service.credstore.PasswordCredential)  java.security.AccessController
.doPrivileged(new
java.security.PrivilegedExceptionAction<oracle.security.jps.service.credstore.
Credential>() {
public
oracle.security.jps.service.credstore.Credential run() throws Exception {
return (credStore .getCredential(mapName, csfKey));
}
});
} else {
// failure obtaining csf credentials
}
}
} catch (final java.security.PrivilegedActionException ex) {
//handle excpetion
} catch (final oracle.security.jps.JpsException jpse) {
//handle excpetion
}
return passwordCredential;
}

private static oracle.security.jps.service.credstore.CredentialStore
getCredStore() throws oracle.security.jps.JpsException {
oracle.security.jps.service.credstore.CredentialStore csfStore;
oracle.security.jps.service.credstore.CredentialStore appCsfStore = null;
oracle.security.jps.service.credstore.CredentialStore systemCsfStore =
null;

final oracle.security.jps.internal.api.runtime.ServerContextFactory
factory = (oracle.security.jps.internal.api.runtime.ServerContextFactory)
oracle.security.jps.JpsContextFactory
.getContextFactory();

final oracle.security.jps.JpsContext jpsCtxSystemDefault =
factory.getContext(oracle.security.jps.internal.api.runtime.ServerContextFactory.S
cope.SYSTEM);

final oracle.security.jps.JpsContext jpsCtxAppDefault = factory
.getContext(oracle.security.jps.internal.api.runtime.ServerContextFactory.Scope.AP
PLICATION);

appCsfStore = (jpsCtxAppDefault != null) ? jpsCtxAppDefault
.getServiceInstance(oracle.security.jps.service.credstore.CredentialStore.class) :
null;

if (appCsfStore == null) {
systemCsfStore = jpsCtxSystemDefault
.getServiceInstance(oracle.security.jps.service.credstore.CredentialStore.class);
csfStore = systemCsfStore;
} else {
//use Credential Store defined in app-level jps-config.xml
csfStore = appCsfStore;
}
return csfStore;
}

注意:
JARファイルoracle.jps_11.1.1/jps-api.jar、oracle.jps_11.1.1/jps-unsupported-api.jarは、クラスパスに含まれている必要があります。

system-jazn-data.xmlファイルで、カスタム・ポリシー・エグゼキュータに対して、必要な権限を指定する必要があります。次に例を示します。

<grant>
<grantee>
<codesource>
<url>file:{location of custom policy executor jar}</url>
</codesource>
</grantee>
<permissions>
<permission>
<class>oracle.security.jps.service.credstore.CredentialAccessPermission</class>
<name>context=SYSTEM,mapName=*,keyName=*</name>
<actions>*</actions>
</permission>
</permissions>
</grant>

4.8 カスタム・アサーションでの例外処理

カスタム・アサーション実行中の例外は、すべてWSMExceptionがカスタム・アサーション・エグゼキュータで処理する必要があります。

IResult execute(IContext mcontext) throws WSMException

このメソッドは、常に、null以外のIResultオブジェクトを返します。ステータス・フィールドは、成功、失敗または他の状態を示します。IResult.getFault()メソッドは失敗の詳細な原因を返すために使用され、成功の場合はnullを返します。

次の例に示すように、カスタム・アサーション・エグゼキュータの実行メソッドから発生している例外は、まず、WSMExceptionでラップする必要があります。実行ステータスがIResult.FAILEDに設定され、generateFault methodがWSMExceptionをスローします。

IResult execute(IContext mcontext) throws WSMException {
IResult result = new Result();
try {
....
.....

} catch (Exception e) {
WSMException wsmException = new WSMException(e);
result.setStatus(IResult.FAILED);
generateFault(wsmException);
}
}

A カスタム・アサーションのスキーマ参照

この付録では、カスタムのWebサービス・アサーションを含むWS-Policyファイルを作成するときに参照するXMLスキーマについて説明します。この項の内容は次のとおりです。

- 図解

- 要素の説明

A.1 図解

次の画像に、WS-Policyファイル内のカスタム・アサーションの要素階層を示します。

図A-1 カスタム・アサーションの要素階層

「図A-1 カスタム・アサーションの要素階層」の説明

A.2 要素の説明

次の項では、カスタム・アサーションの要素をより詳細に説明します。

A.2.1 wsp:Policy

ネストされたポリシー・アサーションをグループ化します。

A.2.1.1 属性

次の表に、WS-Policy属性へのOracleの拡張機能をまとめます。

表A-1 WS-Policy属性へのOracle拡張機能

属性

説明

attachTo

ポリシーを添付できるポリシー・サブジェクト。有効な値は、binding.client、binding.server、binding.anyです。

category

ポリシーのカテゴリ。有効な値は、security、mtom、wsrm、addressing、managementです。

description

ポリシーの説明。

status

ポリシー参照のステータス。有効な値は、enabledおよびdisabledです。

A.2.1.2 例

<wsp:Policy xmlns="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:orasp="http://schemas.oracle.com/ws/2006/01/securitypolicy"
orawsp:status="enabled"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-util
ity-1.0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
orawsp:category="security"
orawsp:attachTo="binding.server"
wsu:Id="ip_assertion_policy"
xmlns:orawsp="http://schemas.oracle.com/ws/2006/01/policy"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
wsp:Name="oracle/ip_assertion_policy">

A.2.2 orasp:Assertion

カスタム・アサーションの主な要素。

A.2.2.1 属性

次の表に、orasp:Assertion要素の属性をまとめます。

表A-2 <orasp:Assertion>要素の属性

要素の属性" width="100%">

属性

説明

Optional

アサーションがオプションなのか、必須なのかを指定するフラグ。

Silent

アサーションを通知するかどうかを指定するフラグ。trueに設定すると、アサーションは通知されません。

Enforced

現時点でアサーションを有効にするかどうかを指定するフラグ。

name

アサーションの名前。

description

アサーションの説明。

category

アサーションを適用するカテゴリ。有効な値は、security/authentication、security/msg-protection、security/authorization、security/logging、mtom、wsrm、addressing、managementです。

A.2.2.2 例

<orasp:ipAssertion orawsp:Silent="true" orawsp:Enforced="true"
orawsp:name="WSSecurity IpAssertion Validator"
orawsp:category="security/authentication">
...
</orasp:ipAssertion>

A.2.3 orawsp:bindings

<oraswsp:bindings>要素は、カスタム・アサーションのバインディングを定義します。

A.2.3.1 例

<orawsp:bindings>
...
</orawsp:bindings>

A.2.4 orawsp:Implementation

<oraswsp:Implementation>要素は、カスタム・アサーション実装クラスを定義します。

A.2.4.1 例

<orawsp:Implementation>acme.security.wss.executor.WssUsernameTokenExecutor</orawsp
:Implementation>

A.2.5 orawsp:Config

<oraswsp:Config>要素は、カスタム・アサーションの構成を定義します。

A.2.5.1 属性

次の表に、orawsp:Config要素の属性をまとめます。

表A-3 <orawsp:Config>要素の属性

要素の属性" width="100%">

属性

説明

name

構成の名前。

type

構成を適用するカテゴリ。

configType

構成のタイプ。有効な値は、declarativeおよびprogrammaticです。

- declarative: デプロイメント・ディスクリプタおよび構成ファイルを使用して、認証と認可の要件を表します。

- programmatic: アプリケーション内にセキュリティ強制を埋め込みます。

A.2.5.2 例

<orawsp:Config orawsp:name="ipassertion" orawsp:configType="declarative">

A.2.6 orawsp:PropertySet

<oraswsp:PropertySet>要素は、ネストされたプロパティをグループ化します。

A.2.6.1 属性

次の表に、orawsp:PropertySet要素の属性をまとめます。

表A-4 <orawsp:PropertySet>要素の属性

要素の属性" width="100%">

属性

説明

name

プロパティ・セットの名前。

A.2.6.2 例

<orawsp:PropertySet orawsp:name="valid_ips">

A.2.7 orawsp:Property

<oraswsp:Property>要素は、1つのプロパティを定義します。

A.2.7.1 属性

次の表に、orawsp:Property要素の属性をまとめます。

表A-5 <orawsp:Property>要素の属性

要素の属性" width="100%">

属性

説明

name

プロパティの名前。

type

プロパティのタイプ。例: String

contentType

プロパティが必須かどうかおよび上書き可能かどうかを指定します。有効な値は次のとおりです。

- constant: プロパティは定数値で、上書きできません。

- required: プロパティは必須で、上書きできます。

- optional: プロパティはオプションで、上書きできます。

ポリシーのオーバーライドの詳細は、『Oracle Fusion Middleware Webサービスのためのセキュリティおよび管理者ガイド』のオーバーライド可能なクライアント・ポリシーのアタッチに関する項を参照してください。

A.2.7.2 例

<orawsp:Property orawsp:name="valid_ips" orawsp:type="string"
orawsp:contentType="constant">

A.2.8 orawsp:Description

<oraswsp:Description>要素は、プロパティの説明を定義します。

A.2.8.1 例

<orawsp:Description>Valid IP Values</orawsp:Description>

A.2.9 orawsp:Value

<oraswsp:Value>要素は、プロパティの有効な値をリストします。

A.2.9.1 例

<orawsp:Value>140.87.6.143,10.178.93.107</orawsp:Value>

Copyright © 2011, Oracle and/or its affiliates. All rights reserved.