Oracle® Fusion Middleware

Oracle Web Services Manager拡張可能アプリケーションの開発

12c (12.2.1.1)

E79355-01(原本部品番号:E71228-01)

2016年6月

Oracle Web Services Manager (OWSM)を使用してカスタム・アサーションを開発する方法について説明するソフトウェア開発者用のドキュメントです。

Oracle Fusion Middleware Oracle Web Services Manager拡張可能アプリケーションの開発, 12c (12.2.1.1)

E79355-01

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

原本著者: Lawallambok Wahlang

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

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

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

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs. No other rights are granted to the U.S. Government.

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(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 Corporationとの間の契約に別段の定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。適用されるお客様とOracle Corporationとの間の契約に定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

目次

図一覧

表一覧

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

はじめに

- 対象読者

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

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

- 関連ドキュメント

- 表記規則

このガイドで説明する新機能

- リリース12c (12.2.1.1)の新機能と変更された機能

- リリース12c (12.2.1)の新機能と変更された機能

- リリース12c (12.1.3)の新機能と変更された機能

- リリース12c (12.1.2)の新機能と変更された機能

1 Oracle Web Services Managerのポリシーとアサーションの理解

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

- 1.2Webサービス・ポリシーの作成について

- 1.3 カスタム・アサーションの理解

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

- 1.3.2 ポリシーの組合せについて

- 1.3.2.1 ポリシーとアサーションの組合せ

- 1.3.2.2 ポリシーと2つのアサーションおよびwsp:Allオペレータの組合せ

- 1.3.2.3 ポリシーと多数のアサーションおよびwsp:ExactlyOneオペレータの組合せ

- 1.3.3 サポートされるカスタム・アサーションのカテゴリ

- 1.3.4 カスタム・アサーションのバインディングのルールについて

- 1.3.5 カスタム・アサーションのライフサイクルについて

- 1.3.6 カスタム・アサーションのタイプの理解

- 1.3.6.1 シンプル・アサーションの理解

- 1.3.6.1.1 シンプル・アサーションを使用する際のルール

- 1.3.6.1.2 シンプル・アサーションの疑似スキーマの定義

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

- 1.3.6.2.1 複数要素のシンプル・アサーションを使用する際のルール

- 1.3.6.2.2 複数要素のシンプル・アサーションの疑似スキーマの定義

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

- 2.1 ポリシー名について

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

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

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

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

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

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

- 2.2.3.2.1 ポリシー構成ファイルについて

- 2.2.3.2.2 ポリシー構成ファイルの定義

- 2.2.4 カスタム・アサーションJARファイルの作成

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

- 2.2.5.1 ポリシー・ストアへのカスタム・ポリシーの追加(Fusion Middleware Controlを使用する場合)

- 2.2.5.2 ポリシー・ストアへのカスタム・ポリシーの追加(WLSTを使用する場合)

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

- 2.2.7 Webサービスへのカスタム・ポリシーのアタッチ

- 2.3 Webサービスのテスト

3 サンプル・カスタム・アサーションの管理

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

- 3.1.1 カスタム・アサーション・エグゼキュータを使用したIPアドレスの検証

- 3.1.2 ポリシー・ファイルを使用したIPアドレスの検証

- 3.1.3 policy-config.xmlファイルを使用したIPアドレスの検証

- 3.1.4 Webサービスを使用したIPアドレスの検証

- 3.1.5 JSEクライアントを使用したIPアドレスの検証

- 3.2 カスタム・アサーションでのIPアドレス検証の実行

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

- 3.3.1 カスタム・アサーション・エグゼキュータを使用したデータの暗号化と復号化

- 3.3.2 カスタム・アサーション・エグゼキュータを使用したインバウンド・メッセージの要素の暗号化

- 3.3.3 カスタム・アサーション・エグゼキュータを使用したアウトバウンド・メッセージの要素の復号化

- 3.3.4 カスタム・アサーション・エグゼキュータを使用したデータの暗号化

- 3.3.5 カスタム・アサーション・エグゼキュータを使用したデータの復号化

- 3.3.6 コンポジット・アプリケーションを使用した暗号化されたメッセージの受信

- 3.3.7 コンポジット・アプリケーションを使用した復号化されたメッセージの受信

- 3.4 カスタム・アサーションでのデータの暗号化と復号化の実行

- 3.5 カスタム・アサーションでのユーザーの認証

- 3.5.1 カスタム・アサーション・エグゼキュータを使用した認証

- 3.5.2 ポリシー・ファイルを使用した認証

- 3.5.3 ファイルを使用したユーザー認証の実装

- 3.5.3.1 ログイン構成ファイルを使用した認証

- 3.5.3.2 カスタム・ログイン・モジュール・クラスの実装

- 3.5.3.3 単純なログイン・モジュール・クラスの実装

- 3.5.3.4 コールバック・ハンドラ・クラスの実装

- 3.6 カスタム・アサーションでのユーザー認証の実行

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

- 4.1 カスタム・アサーションのパラメータの指定

- 4.1.1 カスタム・アサーションのインタフェースについて

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

- 4.2 OWSMコンテキスト・プロパティの検査

- 4.2.1 OWSMコンテキスト・プロパティのインタフェースについて

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

- 4.3 OWSMカスタム・セキュリティ・アサーションへのアクセス

- 4.3.1 OWSMカスタム・セキュリティ・アサーションのステージについて

- 4.3.2 OWSMカスタム・セキュリティ・アサーションのインタフェースについて

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

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

- 4.4.1 XPath式について

- 4.4.2 ノードの値の特定

- 4.4.3 名前空間コンテキストへの名前空間の追加

- 4.4.4 ノードの値の取得

- 4.5 SSLのコンテナで使用される証明書の取得

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

- 4.7 資格証明ストア・フレームワークのキーへのアクセス

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

- 4.8.1 WSMExceptionメソッドについて

- 4.8.2 WSMExceptionでの例外処理

A カスタム・アサーションのスキーマ・リファレンス

- A.1 WS-Policyファイル内のカスタム・アサーションの要素階層

- 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

図一覧

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

表一覧

- 1-1 サポートされるカスタム・アサーションのカテゴリ

- 2-1 key要素の属性

- 4-1 XPath式の例

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

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

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

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

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

はじめに

ここでは、このガイド『Oracle Web Services Manager拡張可能アプリケーションの開発』のドキュメントのアクセシビリティ機能および規則について説明します。

対象読者

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

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

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

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

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

- カスタム・アサーションのパーツとタイプについての学習
詳細は、「ポリシーの組合せについて」および「カスタム・アサーションのタイプの理解」を参照してください。

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

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

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

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

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

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

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

コード例

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

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

- カスタム・アサーションでのユーザーの認証

高度なトピック

- 高度な機能の実装:

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

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

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

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

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

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

- CSFキーへのアクセス

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

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

参照情報

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

- OWSMの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サポートへのアクセス

サポートを購入したオラクル社のお客様は、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ドキュメントを参照してください。

- 『Oracle Fusion Middleware Infrastructureリリース・ノート』のWebサービスに関する項

- 『Webサービスの管理』

- Oracle Fusion Middlewareライブラリ

表記規則

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

表記規則

意味

太字

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

イタリック

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

固定幅フォント

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

このガイドで説明する新機能

この章では、Oracle Web Services Manager (OWSM)の拡張のための新しい機能と変更された機能を示します。

このドキュメントは、旧名『Oracle Web Services Manager拡張ガイド』の新版です。

リリース12c (12.2.1.1)の新機能と変更された機能

このトピックでは、リリース12c (12.2.1.1)の新機能と変更された機能について説明します。

修正や訂正などのマイナー更新がこのドキュメントに対して行われました。

リリース12c (12.2.1)の新機能と変更された機能

このトピックでは、リリース12c (12.2.1)の新機能と変更された機能について説明します。

修正や訂正などのマイナー更新がこのドキュメントに対して行われました。

リリース12c (12.1.3)の新機能と変更された機能

このトピックでは、リリース12c (12.1.3)の新機能と変更された機能について説明します。

このドキュメントに記載されているOracle Fusion Middleware 12c (12.1.3)の新機能と変更された機能は次のとおりです。

- orasp:ipAssertion要素の"provides"属性のサポートが追加されました。この属性は、RESTful Webサービスおよびクライアント・エンドポイントに必要です。詳細は、次の項を参照してください。

- 「カスタム・ポリシー・ファイルの作成」

- 「orasp:Assertion」

リリース12c (12.1.2)の新機能と変更された機能

このトピックでは、リリース12c (12.1.2)の新機能と変更された機能について説明します。

Oracle Fusion Middleware 12c (12.1.2)では、新しい機能も将来のバージョンで変更される機能もありません。

1 Oracle Web Services Managerのポリシーとアサーションの理解

Oracle Web Services Manager (OWSM)は、Oracle Fusion Middlewareのインストール時に自動的に使用可能になる、一連の事前定義済ポリシーとアサーション・テンプレートを提供します。また、事前定義済のポリシーでは特定の機能が提供されてない場合は、OWSMを使用することで、カスタム・アサーションを開発することもできます。たとえば、OWSMでは使用できない認証タイプをアプリケーションで使用する必要がある場合は、カスタムの認証アサーションを作成できます。このマニュアルには、カスタム・アサーションの開発方法、デプロイ方法、テスト方法についての情報が記載されています。

この章の内容は次のとおりです。

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

- Webサービス・ポリシーの作成について

- カスタム・アサーションの理解

このマニュアルおよびこの他のマニュアルに、なじみのない用語が出てきた場合は、用語集で定義を確認してください。

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

OWSMは、Oracle Fusion Middlewareで読取り専用の事前定義されたポリシーを提供します。

OWSMポリシーの詳細および使用の詳細は、『Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理』を参照してください。

各ポリシーは、ドメインレベルで定義された、セキュリティ要件を定義する1つ以上のアサーションで構成されます。また、OWSMには、事前定義済のアサーション・テンプレートのセットが用意されています。これらの事前定義済アサーションと、それらの使用方法については、次を参照してください。

- 『Oracle Web Services ManagerによるWebサービスの保護およびポリシーの管理』の事前定義済のアサーション・テンプレートに関する項

- 『Oracle Web Services ManagerによるWebサービスの保護およびポリシーの管理』のポリシー・アサーション・テンプレートの管理に関する項

既存のアサーションの使用に加えて、OWSMのAPIを使用することで独自のカスタム・アサーションを開発することもできます。詳細は、Oracle Web Services Manager Java APIリファレンスを参照してください。

1.2 Webサービス・ポリシーの作成について

このトピックでは、Webサービス・ポリシーの作成に使用できる方法の一覧を示します。

次に示すいずれかの方法を使用して、Webサービス・ポリシーを作成できます。

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

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

- zipアーカイブからポリシーをインポート

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

最初の3つの方法については、『Webサービスの管理』のWebサービス・ポリシーの管理に関する項に説明があります。

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

1.3 カスタム・アサーションの理解

カスタム・アサーションを開発することで、OWSMが提供する事前定義済のポリシーやアサーションでは使用できない特定の機能の要件を満たせるようになります。

次に示す各トピックでは、カスタム・アサーションについての理解に役立つ情報について説明します。

- ポリシー、アサーション、式およびオペレータについて

- ポリシーの組合せについて

- サポートされるカスタム・アサーションのカテゴリ

- カスタム・アサーションのバインディングのルールについて

- カスタム・アサーションのライフサイクルについて

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

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

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

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

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

1.3.2 ポリシーの組合せについて

ポリシーには、アサーションまたはオペレータを組み合せることができます。

これについては、次の各トピックで詳しく説明します。

- ポリシーとアサーションの組合せ

- ポリシーと2つのアサーションおよびwsp:Allオペレータの組合せ

- ポリシーと多数のアサーションおよびwsp:ExactlyOneオペレータの組合せ

1.3.2.1 ポリシーとアサーションの組合せ

このトピックでは、1つのアサーション(orasp:AssertionOne)が含まれるポリシー(wsp:Policy要素で定義)を示す例について説明します。

次に、例を示します。各要素と、それらの属性のOracle拡張機能の詳細は、「カスタム・アサーションのスキーマ・リファレンス」を参照してください。

<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.3.2.2 ポリシーと2つのアサーションおよびwsp:Allオペレータの組合せ

このトピックでは、ポリシーに2つのアサーションを組み合せる例を示します。

次の例では、ポリシー・アサーションのリストをポリシー・オペレータのwsp:All要素でラップする例を示します(リスト内のすべてのポリシー・アサーションが、trueと評価される必要があります)。wsp:Policy要素は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.2.3 ポリシーと多数のアサーションおよびwsp:ExactlyOneオペレータの組合せ

このトピックでは、ポリシーに複数のアサーションを組み合せる例を示します。

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

<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.3 サポートされるカスタム・アサーションのカテゴリ

このトピックでは、サポートされるカスタム・アサーションのカテゴリについて説明します。このカテゴリは、準拠しているWebサービスの仕様と重要度に基づいています。カテゴリの指定には、orasp:Assertion要素のorawsp:category属性を使用します。

説明については、表1-1を参照してください。「サンプル・カスタム・アサーションの管理」には、セキュリティ・カスタム・アサーションの様々なカテゴリのサンプルがあります。

表1-1 サポートされるカスタム・アサーションのカテゴリ

カテゴリ

説明

orawsp:categoryの有効な値

セキュリティ

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

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

管理

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

management

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

1.3.4 カスタム・アサーションのバインディングのルールについて

このトピックでは、アサーションでバインディングを定義するために使用する<orawsp:bindings>要素について説明します。

アサーションでバインディングを定義するために使用する<orawsp:bindings要素の詳細は、『Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理』のorawsp:bindingsに関する項を参照してください。

1.3.5 カスタム・アサーションのライフサイクルについて

OWSMランタイムは、カスタム・アサーションのライフサイクルを管理します。このライフサイクルは、初期化、実行、実行後、および終了の4つのフェーズで構成されています。各フェーズで、OWSMランタイムはカスタム・アサーション・エグゼキュータのメソッドを起動します。

カスタム・ポリシーのカスタム・アサーション・エグゼキュータ内で、次のメソッドを実装する必要があります。

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

- IResult execute(IContext mcontext): このメソッドは、リクエスト、レスポンスおよびフォルトなどのステージで呼び出されます。このメソッドは、常に、null以外のIResultオブジェクトを返します。ポリシー実行のステージについては、「OWSMカスタム・セキュリティ・アサーションへのアクセス」を参照してください。

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

- void destroy(): この破棄メソッドは、アプリケーションのシャットダウン中に、OWSMランタイムによって起動されます。アサーションのライフサイクルの終了時にクリーナとして起動されます。

1.3.6 カスタム・アサーションのタイプの理解

ポリシー・オブジェクト・モデルでは、シンプル・アサーションと複数要素のシンプル・アサーションという2種類のアサーションを定義しています。

次の各トピックで、さらに詳しく説明します。

- シンプル・アサーションの理解

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

1.3.6.1 シンプル・アサーションの理解

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

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

- シンプル・アサーションを使用する際のルール

- シンプル・アサーションの疑似スキーマの定義

1.3.6.1.1 シンプル・アサーションを使用する際のルール

このトピックでは、シンプル・アサーションを使用する際のルールの一覧を示します。

シンプル・アサーションを使用するときには、次に示す使用上のルールに注意してください。

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

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

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

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

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

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

1.3.6.1.2 シンプル・アサーションの疑似スキーマの定義

このトピックでは、バインディング要素のみを含むシンプル・アサーションの疑似スキーマを示します。

この疑似スキーマを次に示します。

<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.6.2 複数要素のシンプル・アサーションの理解

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

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

- 複数要素のシンプル・アサーションを使用する際のルール

- 複数要素のシンプル・アサーションの疑似スキーマの定義

1.3.6.2.1 複数要素のシンプル・アサーションを使用する際のルール

このトピックでは、複数要素のシンプル・アサーションを使用する際のルールの一覧を示します。

複数要素のシンプル・アサーションを使用するときには、次に示す使用上のルールに注意してください。

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

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

1.3.6.2.2 複数要素のシンプル・アサーションの疑似スキーマの定義

このトピックでは、バインディング以外の要素を含めることができる複数要素のシンプル・アサーションの疑似スキーマを示します。

この疑似スキーマを次に示します。

<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サービスのためのカスタム・アサーションの開発

- Webサービスのテスト

2.1 ポリシー名について

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

『Oracle Web Services Managerの理解』のポリシーの推奨ネーミング規則に関する項で説明されているポリシーのネーミング規則に従うことをお薦めします。同じ規則がアサーションのネーミングに使用されます。

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

カスタム・アサーションを開発する場合は、カスタム・ポリシー・ファイルをインポートして、Webサービスまたはクライアントにアタッチします。

次の各トピックで、さらに詳しく説明します。

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

2. カスタム・ポリシー・ファイルの作成

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

4. カスタム・アサーションJARファイルの作成

5. ポリシー・ストアへのカスタム・ポリシーの追加

6. カスタム・アサーションのデプロイ

7. Webサービスへのカスタム・ポリシーのアタッチ

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

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

カスタム・アサーション・エグゼキュータの作成時には、次に示すJARファイルがCLASSPATHに含まれていることを確認します。

- wsm-policy-core.jar

- wsm-agent-core.jar

- oracle.logging-utils_11.1.1.jar (それぞれ、 oracle_common/modules/oracle.wsm.common_12.1.2、 oracle_common/modules/oracle.wsm.common_12.1.2、および oracle_common/modulesにあります)

これらのファイルは、必要に応じてCLASSPATHに追加します。

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

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;
}
}

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

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

カスタム・ポリシー・ファイルを作成し、カスタム・アサーションのバインディングの定義とカスタム・アサーションの構成を行います。

「カスタム・アサーションのスキーマ・リファレンス」では、カスタム・ポリシー・ファイルとカスタム・アサーションの作成に使用できるスキーマについて説明します。

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

<?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>

このカスタム・ポリシー・ファイルをRESTful Webサービスとクライアント・エンドポイントで使用するには、次のようにprovides属性をorasp:ipAssertion要素に追加する必要があります。

<orasp:ipAssertion orawsp:Silent="true" orawsp:Enforced="true"
orawsp:name="WSSecurity IpAssertion Validator"
orawsp:category="security/authentication"
orawsp:provides="{http://schemas.oracle.com/ws/2006/01/policy}REST_HTTP">
</orasp:ipAssertion>

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

カスタム・ポリシー・ファイルまたはpolicy-config.xmlファイルで、カスタム・アサーション・エグゼキュータを指定します。

次の各トピックで、さらに詳しく説明します。

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

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

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

このトピックでは、orawsp:Implementation要素でカスタム・エグゼキュータ情報を指定するために、カスタム・ポリシーを更新する例を示します。

次に、例を示します。

<?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>

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

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

この項には次のトピックが含まれます:

- ポリシー構成ファイルについて

- ポリシー構成ファイルの定義

2.2.3.2.1 ポリシー構成ファイルについて

このトピックでは、policy-config.xmlファイルのフォーマットと、Key要素の属性について説明します。

次の例に、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)と一致する必要があります。

「カスタム・ポリシー・ファイルの作成」のカスタム・ポリシー・ファイルの例では、次に示すように、namespaceが<wsp:Policy>タグの一部として定義されています。

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

element-name

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

「カスタム・ポリシー・ファイルの作成」のカスタム・ポリシー・ファイルの例では、要素名ipAssertionが次のタグで定義されています。

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

2.2.3.2.2 ポリシー構成ファイルの定義

このトピックでは、ipAssertionポリシーのエントリが含まれている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ファイルは、サーバーのCLASSPATHに含まれている必要があります。「カスタム・アサーションJARファイルの作成」で説明するように、このファイルをカスタム・エグゼキュータのjarファイルに追加してください。

2.2.4 カスタム・アサーションJARファイルの作成

カスタム・アサーション・エグゼキュータとpolicy-config.xmlファイルを含むカスタム・アサーションJARファイルを作成します。

JARファイルの生成には、Oracle JDeveloper、別のIDE、またはjarツールを使用できます。

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

カスタム・ポリシーは、Fusion Middleware ControlまたはWLSTを使用することで、ポリシー・ストアに追加できます。

次の各トピックで、さらに詳しく説明します。

- ポリシー・ストアへのカスタム・ポリシーの追加(Fusion Middleware Controlを使用する場合)

- ポリシー・ストアへのカスタム・ポリシーの追加(WLSTを使用する場合)

2.2.5.1 ポリシー・ストアへのカスタム・ポリシーの追加(Fusion Middleware Controlを使用する場合)

このトピックでは、Fusion Middleware Controlを使用して、ポリシー・ストアにカスタム・ポリシーを追加する手順について説明します。

カスタム・ポリシーをWebサービスにアタッチするには、まず、『Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理』のWebサービス・ポリシーのインポートに関する項で説明する手順を実行して、カスタム・ポリシーをインポートする必要があります。

2.2.5.2 ポリシー・ストアへのカスタム・ポリシーの追加(WLSTを使用する場合)

このトピックでは、WLSTを使用して、ポリシー・ストアにカスタム・ポリシーを追加する手順について説明します。

WebLogic Scripting Tool (WLST)コマンドを使用して、カスタム・ポリシーをインポートします。詳細は、『Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理』のリポジトリでのドキュメントのインポートおよびエクスポートに関する項を参照してください。

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

このトピックでは、CLASSPATHにカスタム・アサーションJARを追加する手順について説明します。

カスタム・アサーションJARファイルは、WLSTコマンドを使用することで、CLASSPATHに追加できます。そのためには、次の手順を実行します。

1. WLSTコマンドを起動します。このコマンドは、ORACLE_HOME/oracle_common/common/bin/wlst.sh (UNIX) またはORACLE_HOME\oracle_common\common\bin\wlst.cmd (Windows)にあります。

2. appendToExtensionLoaderコマンドを実行して、ターゲット・リストで指定したサーバーにカスタム・アサーションjarファイルを追加します。

appendToExtensionLoader('path to custom-assertion.jar’, ‘comma separated targets')

次に例を示します。

connect('demouser', 'demopassword', 't3://localhost:7001')
appendToExtensionLoader(‘/user/home/customAssertion.jar’, ‘server1,server2,server3')

また、カスタム・アサーションJARは、次の手順を実行することで、CLASSPATHに手動で追加することもできます。

1. WebLogic Serverを停止します。

2. 「カスタム・アサーションJARファイルの作成」の説明に従って作成したカスタム・アサーションJARファイルを$DOMAIN_HOME/libディレクトリにコピーします。

3. WebLogic Serverを再起動します。

WebLogic Serverの起動および停止の詳細は、『Oracle Fusion Middlewareの管理』のOracle WebLogic Serverインスタンスの起動および停止に関する項を参照してください。

2.2.7 Webサービスへのカスタム・ポリシーのアタッチ

このトピックでは、Webサービスにカスタム・ポリシーをアタッチする手順について説明します。

『Oracle WebLogic Server WebLogic Webサービスの理解』のWebLogic Webサービスの実装のロードマップに関する項の情報に従って、Webサービスを作成します。

『Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理』のポリシーのアタッチに関する項の説明に従って、Webサービスにカスタム・ポリシーをアタッチします。

2.3 Webサービスのテスト

Fusion Middleware ControlのWebサービスのテスト・ページを使用して、Webサービスをデプロイしないで、Webサービスの操作をテストし、結果を表示します。

詳細は、『Webサービスの管理』のWebサービスのテストに関する説明を参照してください。

clientgenを使用してWebサービスのクライアント・プロキシを作成することで、Webサービスをテストすることもできます。詳細は、『Oracle WebLogic Server JAX-WS Webサービスの開発』のclientgen Antタスクを使用したクライアント・アーティファクトの生成に関する項を参照してください。

3 サンプル・カスタム・アサーションの管理

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

次の各トピックで、さらに詳しく説明します。

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

- カスタム・アサーションでのIPアドレス検証の実行

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

- カスタム・アサーションでのデータの暗号化と復号化の実行

- カスタム・アサーションでのユーザーの認証

- カスタム・アサーションでのユーザー認証の実行

3.1 カスタム・アサーションでのIPアドレスの検証

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

この項には次のトピックが含まれます:

- カスタム・アサーション・エグゼキュータを使用したIPアドレスの検証

- ポリシー・ファイルを使用したIPアドレスの検証

- policy-config.xmlファイルを使用したIPアドレスの検証

- Webサービスを使用したIPアドレスの検証

- JSEクライアントを使用したIPアドレスの検証

3.1.1 カスタム・アサーション・エグゼキュータを使用したIPアドレスの検証

このトピックでは、IPアドレスを検証するためのサンプル・カスタム・アサーション・エグゼキュータを示します。

このサンプル・カスタム・アサーション・エグゼキュータを次に示します。

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.1.2 ポリシー・ファイルを使用したIPアドレスの検証

このトピックでは、IPアドレスを検証するためのサンプル・ポリシー・ファイルを示します。

このサンプル・ポリシー・ファイルを次に示します。

<?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>

3.1.3 policy-config.xmlファイルを使用したIPアドレスの検証

このトピックでは、カスタム・アサーション・エグゼキュータを指定するために、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>

3.1.4 Webサービスを使用したIPアドレスの検証

このトピックでは、IPアドレスを検証するためのサンプルWebサービスを示します。

このサンプルWebサービスを次に示します。「Webサービスへのカスタム・ポリシーのアタッチ」で説明したように、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";
}
}

3.1.5 JSEクライアントを使用したIPアドレスの検証

このトピックでは、Webサービスから生成されるサンプルJSEクライアントを示します。

次のサンプルは、「Webサービスを使用したIPアドレスの検証」で示したWebサービスから生成される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 カスタム・アサーションでのIPアドレス検証の実行

このトピックでは、カスタム・アサーションでIPアドレスの検証を実行する手順について説明します。

カスタム・アサーションでIPアドレスの検証を実行するには:

1. 「カスタム・アサーション・エグゼキュータを使用したIPアドレスの検証」で説明したサンプル・コードを使用して、カスタム・アサーションとカスタム・アサーション・エグゼキュータを作成します。これらのサンプルは次の主な機能を示しています。

- カスタム・アサーションに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()

詳細は、「OWSMカスタム・セキュリティ・アサーションへのアクセス」を参照してください。

- カスタム・アサーション・エグゼキュータから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();

詳細は、「OWSMコンテキスト・プロパティの検査」を参照してください。

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

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

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

2. 「カスタム・アサーションJARファイルの作成」の説明に従って、JARファイルを作成します。

3. 「ポリシー・ストアへのカスタム・ポリシーの追加」の説明に従って、ポリシー・ストアにカスタム・ポリシーを追加します。

4. 「カスタム・アサーションのデプロイ」の説明に従って、CLASSPATHを更新します。

5. 「Webサービスへのカスタム・ポリシーのアタッチ」で説明した方法のいずれかを使用して、Webサービスにカスタム・ポリシーをアタッチします。

6. 「JSEクライアントを使用したIPアドレスの検証」で示したようにJSEクライアントを作成して、Webサービスをテストします。

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

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

この項には次のトピックが含まれます:

- カスタム・アサーション・エグゼキュータを使用したデータの暗号化と復号化

- カスタム・アサーション・エグゼキュータを使用したインバウンド・メッセージの要素の暗号化

- カスタム・アサーション・エグゼキュータを使用したアウトバウンド・メッセージの要素の復号化

- カスタム・アサーション・エグゼキュータを使用したデータの暗号化

- カスタム・アサーション・エグゼキュータを使用したデータの復号化

- コンポジット・アプリケーションを使用した暗号化されたメッセージの受信

- コンポジット・アプリケーションを使用した復号化されたメッセージの受信

3.3.1 カスタム・アサーション・エグゼキュータを使用したデータの暗号化と復号化

このトピックでは、データの暗号化と復号化に使用するサンプル・カスタム・アサーション・エグゼキュータを示します。

このサンプル・カスタム・アサーション・エグゼキュータを次に示します。実装の詳細は、「カスタム・アサーションでのデータの暗号化と復号化の実行」を参照してください。

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.3.2 カスタム・アサーション・エグゼキュータを使用したインバウンド・メッセージの要素の暗号化

このトピックでは、インバウンド・メッセージの要素を暗号化するためのサンプル・カスタム・アサーション・エグゼキュータを示します。

このサンプル・カスタム・アサーション・エグゼキュータを次に示します。

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.3.3 カスタム・アサーション・エグゼキュータを使用したアウトバウンド・メッセージの要素の復号化

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

このサンプル・カスタム・アサーション・エグゼキュータを次に示します。

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;
}

// 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.3.4 カスタム・アサーション・エグゼキュータを使用したデータの暗号化

このトピックでは、暗号化のためのサンプル・カスタム・アサーション・エグゼキュータを示します。

このサンプル・カスタム・アサーション・エグゼキュータを次に示します。

<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.3.5 カスタム・アサーション・エグゼキュータを使用したデータの復号化

このトピックでは、カスタム・アサーション・エグゼキュータを使用して、データを復号化する例を示します。

復号用のサンプル・カスタム・アサーションを次に示します。

<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>

3.3.6 コンポジット・アプリケーションを使用した暗号化されたメッセージの受信

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

このサンプル・コンポジット・アプリケーションを次に示します。

<?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.3.7 コンポジット・アプリケーションを使用した復号化されたメッセージの受信

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

このサンプル・コンポジット・アプリケーションを次に示します。

<?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.4 カスタム・アサーションでのデータの暗号化と復号化の実行

このトピックでは、カスタム・アサーションでデータの暗号化と復号化を実行する手順について説明します。

カスタム・アサーションでデータの暗号化と復号化を実行するには:

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. 「カスタム・アサーションJARファイルの作成」の説明に従って、JARファイルを作成します。

3. 「ポリシー・ストアへのカスタム・ポリシーの追加」の説明に従って、ポリシー・ストアにカスタム・ポリシーを追加します。

4. 「カスタム・アサーションのデプロイ」の説明に従って、CLASSPATHを更新します。

5. 「Webサービスへのカスタム・ポリシーのアタッチ」で説明した方法のいずれかを使用して、Webサービスにカスタム・ポリシーをアタッチします。

3.5 カスタム・アサーションでのユーザーの認証

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

この項には次のトピックが含まれます:

- カスタム・アサーション・エグゼキュータを使用した認証

- ポリシー・ファイルを使用した認証

- ファイルを使用したユーザー認証の実装

3.5.1 カスタム・アサーション・エグゼキュータを使用した認証

このトピックでは、認証を実行するカスタム・ログイン・モジュールをサンプル・エグゼキュータで起動する方法を示します。

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

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.5.2 ポリシー・ファイルを使用した認証

このトピックでは、エグゼキュータを起動するサンプル・カスタム・アサーションを示します。これは、WebLogic認証プロバイダに対してユーザーを認証するために使用されます。

次のサンプルは、「カスタム・アサーション・エグゼキュータを使用した認証」で説明したエグゼキュータを呼び出すサンプル・カスタム・アサーションを示しています。これは、WebLogic認証プロバイダに対してユーザーを認証するために使用されます。

<?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.5.3 ファイルを使用したユーザー認証の実装

このトピックでは、ログイン構成ファイルを使用したユーザー認証と、ファイルで指定された様々なクラスの実装を示します。

次の項目が含まれます。

- ログイン構成ファイルを使用した認証

- カスタム・ログイン・モジュール・クラスの実装

- 単純なログイン・モジュール・クラスの実装

- コールバック・ハンドラ・クラスの実装

3.5.3.1 ログイン構成ファイルを使用した認証

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

/** 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.5.3.2 カスタム・ログイン・モジュール・クラスの実装

このトピックでは、サンプルのCustomLoginModuleクラスを示します。これは、javax.security.auth.spi.LoginModuleを実装し、WebLogic認証プロバイダに対してユーザーを認証します。

次に、サンプルのCustomLoginModuleクラスを示します。このクラスは、「ログイン構成ファイルを使用した認証」のLoginConfigファイル内で指定されています。

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.5.3.3 単純なログイン・モジュール・クラスの実装

このトピックでは、サンプルのSimpleLoginModuleクラスを示します。このクラスは、javax.security.auth.spi.LoginModuleの実装を提供します。

サンプルのSimpleLoginModuleクラスを次に示します。

/**
* <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.5.3.4 コールバック・ハンドラ・クラスの実装

このトピックでは、サンプルのCallbackHandlerクラスを示します。このクラスは、javax.security.auth.callback.Callbackインタフェースの実装を提供します。

サンプルのCallbackHandlerクラスを次に示します。

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.6 カスタム・アサーションでのユーザー認証の実行

このトピックでは、カスタム・アサーションでユーザー認証を実行する手順について説明します。

カスタム・アサーションでユーザー認証を実行するには:

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();

詳細は、「OWSMカスタム・セキュリティ・アサーションへのアクセス」を参照してください。

- ユーザーを認証するには、まず、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 (「カスタム・アサーション・エグゼキュータを使用した認証」を参照)を使用して、着信SOAPメッセージにUsernameTokenが含まれているかどうかをチェックし、着信SOAPメッセージから資格証明を取得し、その資格証明をログイン・モジュール・クラスに渡します。

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

result.setStatus(IResult.SUCCEEDED);

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

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

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

2. 「カスタム・アサーションJARファイルの作成」の説明に従って、JARファイルを作成します。

3. 「ポリシー・ストアへのカスタム・ポリシーの追加」の説明に従って、ポリシー・ストアにカスタム・ポリシーを追加します。

4. 「カスタム・アサーションのデプロイ」の説明に従って、CLASSPATHを更新します。

5. 「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. 「ログイン構成ファイルを使用した認証」で作成したログイン構成ファイルを指定します。次のいずれかの方法でファイルを指定できます。

- 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を使用する方法について説明します。この付録の内容は次のとおりです。

- カスタム・アサーションのパラメータの指定

- OWSMコンテキスト・プロパティの検査

- OWSMカスタム・セキュリティ・アサーションへのアクセス

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

- SSLのコンテナで使用される証明書の取得

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

- 資格証明ストア・フレームワークのキーへのアクセス

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

4.1 カスタム・アサーションのパラメータの指定

この項では、カスタム・アサーション・エグゼキュータの内部でパラメータにアクセスするための、各種のインタフェースとメソッドについて説明します。

次の項目が含まれます。

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

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

4.1.1 カスタム・アサーションのインタフェースについて

このトピックでは、カスタム・アサーションにパラメータを入力するために使用できるインタフェースとメソッドの一覧を示します。

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

- IAssertionBindings

- IConfig

- IPropertySet

- getBindings

- getConfigs

- getPropertySets

- getPropertyByName

- getValue

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

このトピックでは、カスタム・アサーションにパラメータを入力する手順について説明します。

カスタム・アサーションにパラメータを入力するには:

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 OWSMコンテキスト・プロパティの検査

このトピックでは、カスタム・アサーション・エグゼキュータの内部で、コンテキスト・プロパティにアクセスするための各種のインタフェースについて説明します。

次の項目が含まれます。

- OWSMコンテキスト・プロパティのインタフェースについて

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

4.2.1 OWSMコンテキスト・プロパティのインタフェースについて

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

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

- IMessageContext

- getServiceURL

- getProperty

- getAllProperty

4.2.2 OWSMコンテキスト・プロパティへのアクセス

このトピックでは、OWSMコンテキスト・プロパティにアクセスする手順について説明します。

OWSMコンテキスト・プロパティにアクセスするには:

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

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

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

messagecontext.getProperty("<property name>");

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

msgContextProperties = messagecontext.getAllProperties();

4.3 OWSMカスタム・セキュリティ・アサーションへのアクセス

この項では、カスタム・アサーション・エグゼキュータの内部で、ステージにアクセスして、リクエスト・メッセージとレスポンス・メッセージを取得するための各種インタフェースについて説明します。

次の項目が含まれます。

- OWSMカスタム・セキュリティ・アサーションのステージについて

- OWSMカスタム・セキュリティ・アサーションのインタフェースについて

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

4.3.1 OWSMカスタム・セキュリティ・アサーションのステージについて

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

これらのステージの詳細を次に示します。

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

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

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

4.3.2 OWSMカスタム・セキュリティ・アサーションのインタフェースについて

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

コンテキスト・プロパティへのアクセスに使用できるインタフェースとメソッドは、次のとおりです。

- IMessageContext

- getStage

- getRequestMessage

- getResponseMessage

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

このトピックでは、リクエスト、レスポンス、およびフォルトの各メッセージ・オブジェクトにアクセスする手順について説明します。

リクエスト、レスポンスおよびフォルトの各メッセージとステージにアクセスするには:

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メッセージのパーツにアクセスできます。

次の各トピックで、さらに詳しく説明します。

- XPath式について

- ノードの値の特定

- 名前空間コンテキストへの名前空間の追加

- ノードの値の取得

4.4.1 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要素を選択します。

4.4.2 ノードの値の特定

このトピックでは、ノードarg0の値を特定するためにXPathを使用する例を示します。

次に、例を示します。

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

4.4.3 名前空間コンテキストへの名前空間の追加

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);

4.4.4 ノードの値の取得

この項では、evaluateメソッドを使用して、ノードの値を取得する例を示します。

次に、例を示します。

//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の証明書を取得する手順について説明します。

SSLの証明書を取得するには:

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

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

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

X509Certificate[] certificates = (X509Certificate[])
soapMsgCtxt.getTransportContext().getAttribute(oracle.wsm.security.util.SecurityConstants.SSL_PEER_CERTIFICATES);

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

このトピックでは、HTTPリクエストとHTTPレスポンスのトランスポート・プロパティにアクセスする手順について説明します。

HTTPリクエストとHTTPレスポンスのトランスポート・プロパティにアクセスするには:

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

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

2. メッセージ・コンテキストからTransportContextを取得します。次に例を示します。

ITransportContext transCtx = invokerCtx.getTransportContext();

各種のプロパティにアクセスする方法については、Oracle Fusion Middleware Oracle Web Services Manager Java APIリファレンスで、javadocクラスのITransportContextとHttpTransportContextを参照してください。これらのクラスについての情報は、oracle.wsm.common.sdkパッケージ内で入手できます。

4.7 資格証明ストア・フレームワークのキーへのアクセス

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

CSFを構成して使用するには:

1. jps-config.xmlでCSFを構成します。

WLSTを使用した資格証明ストアの構成方法の詳細は、『Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理』の資格証明ストアの構成に関する項を参照してください。

2. カスタム・アサーション・エグゼキュータ内部のCSFからCSFキーを追加、更新または取得できます。

次のサンプルを使用すると、資格証明ストアから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()));
}

このサンプルでは、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_12.1.2/jps-api.jar、oracle.jps_12.1.2/jps-unsupported-api.jarがclasspathに含まれている必要があります。

カスタム・ポリシー・エグゼキュータのjarに対して、CredentialAccessPermission権限を指定する必要があります。権限付与の詳細は、『Oracle Platform Security Servicesによるアプリケーションの保護』のJavaセキュリティ・ポリシーの権限の設定関する項を参照してください。

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

このトピックでは、カスタム・アサーション・エグゼキュータで例外を処理するためのWSMExceptionメソッドについて説明します。

次の項目が含まれます。

- WSMExceptionメソッドについて

- WSMExceptionでの例外処理

4.8.1 WSMExceptionメソッドについて

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

IResult execute(IContext mcontext) throws WSMException

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

4.8.2 WSMExceptionでの例外処理

カスタム・アサーション・エグゼキュータのexecuteメソッド内で発生する例外は、まず、WSMExceptionでラップして、実行ステータスをIResult.FAILEDに設定し、generateFaultメソッドで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 カスタム・アサーションのスキーマ・リファレンス

この付録に記載されたXMLスキーマは、カスタムのWebサービス・アサーションを含むWS-Policyファイルを作成するときにリファレンスとして使用できます。

この付録の内容は次のとおりです。

- WS-Policyファイル内のカスタム・アサーションの要素階層

- カスタム・アサーションの要素

A.1 WS-Policyファイル内のカスタム・アサーションの要素階層

このトピックでは、WS-Policyファイル内のカスタム・アサーションの要素階層を示します。

次の図に、これを示します。

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

A.2 カスタム・アサーションの要素

このトピックでは、カスタム・アサーションの要素の一覧を示します。

カスタム・アサーションには、次の要素が含まれています。

- wsp:Policy

- orasp:Assertion

- orawsp:bindings

- orawsp:Implementation

- orawsp:Config

- orawsp:PropertySet

- orawsp:Property

- orawsp:Description

- orawsp:Value

A.2.1 wsp:Policy

このトピックでは、<wsp:Policy>要素と、その属性について説明します。

<wsp:Policy>要素は、ネストされたポリシー・アサーションをグループ化します。

属性

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

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

属性

説明

attachTo

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

category

ポリシーのカテゴリ。有効な値は、securityおよびmanagementです。

description

ポリシーの説明。

status

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

例

次の例は、<wsp:Policy>要素を示しています。

<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

このトピックでは、<orasp:Assertion>要素の属性について説明します。

<orasp:Assertion>要素は、カスタム・アサーションのメイン要素です。

属性

次の表には、<orasp:Assertion>要素の属性がまとめられています。

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

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

属性

説明

Optional

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

Silent

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

Enforced

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

name

アサーションの名前。

description

アサーションの説明。

category

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

provides

このポリシーを添付できるWebサービス・エンドポイント・タイプ。

注意: この属性はRESTfulエンドポイントに必要です。

たとえば、RESTful Webサービスを指定するには、次のようにします。

orawsp:provides="{http://schemas.oracle.com/ws/2006/01/policy}REST_HTTP"

例

次の例は、<orasp:Assertion>要素を示しています。

<orasp:ipAssertion orawsp:Silent="true" orawsp:Enforced="true"
orawsp:name="WSSecurity IpAssertion Validator"
orawsp:category="security/authentication"
orawsp:provides="{http://schemas.oracle.com/ws/2006/01/policy}REST_HTTP">
...
</orasp:ipAssertion>

A.2.3 orawsp:bindings

このトピックでは、<oraswsp:bindings>要素について説明します。

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

例

次の例は、<oraswsp:bindings>要素を示しています。

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

A.2.4 orawsp:Implementation

このトピックでは、<oraswsp:Implementation>要素について説明します。

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

例

次の例は、<oraswsp:Implementation>要素を示しています。

<orawsp:Implementation>sampleassertion.IpAssertionExecutor</orawsp
:Implementation>

A.2.5 orawsp:Config

このトピックでは、<oraswsp:Config>要素と、その属性について説明します。

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

属性

次の表には、<orawsp:Config>要素の属性がまとめられています。

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

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

属性

説明

name

構成の名前。

type

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

configType

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

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

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

例

次の例は、<oraswsp:Config>要素を示しています。

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

A.2.6 orawsp:PropertySet

このトピックでは、<oraswsp:PropertySet>要素と、その属性について説明します。

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

属性

次の表には、<orawsp:PropertySet>要素の属性がまとめられています。

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

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

属性

説明

name

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

例

次の例は、<oraswsp:PropertySet>要素を示しています。

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

A.2.7 orawsp:Property

このトピックでは、<oraswsp:Property>要素と、その属性について説明します。

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

属性

次の表には、<orawsp:Property>要素の属性がまとめられています。

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

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

属性

説明

name

プロパティの名前を指定します。

type

プロパティのタイプ。たとえば、Stringなど。

contentType

プロパティが必須かどうかおよびオーバーライド可能かどうかを指定します。有効な値は、次のとおりです。

- constant: プロパティは定数値で、オーバーライドできません。

- required: プロパティは必須で、オーバーライドできます。

- optional: プロパティはオプションで、オーバーライドできます。

ポリシーのオーバーライドの詳細は、『Webサービスの管理』のポリシー構成のオーバーライドに関する説明を参照してください。

例

次の例は、<orawsp:Property>要素を示しています。

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

A.2.8 orawsp:Description

このトピックでは、<oraswsp:Description>要素について説明します。

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

例

次の例は、<oraswsp:Description>要素を示しています。

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

A.2.9 orawsp:Value

このトピックでは、<oraswsp:Value>要素について説明します。

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

例

次の例は、<oraswsp:Value>要素を示しています。

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

オラクルの法律上の注意点について

コピーライトについて

Copyright © 1994-2017, Oracle and/or its affiliates. All rights reserved.

ライセンス制約の保証と結果的に生じる損害の免責

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

保証免責

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

制限付権利について

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

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs. No other rights are granted to the U.S. Government.

危険な用途への使用について

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

商標と登録商標について

OracleおよびJavaはオラクルおよびその関連会社の登録商標です。その他の社名、商品名等は各社の商標または登録商標である場合があります。

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

第三者のコンテンツ、製品、サービスに対する免責事項

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

アルファ版およびベータ版ドラフト・ドキュメントについて

このドキュメントが試作版の場合:

このドキュメントは試作版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。Oracle Corporationおよびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

非公開のアルファ版およびベータ版ドラフト・ドキュメントについて

このドキュメントが非公開の試作版の場合:

このドキュメントに含まれる情報は、情報の共有のみを目的としたものであって、顧客諮問委員会(Customer Advisory Board)のメンバーとしてのお客様の立場でのみ、またはお客様のベータ・トライアル契約のみに従って検討されるべきものとします。マテリアル、コード、または機能の提供をお約束するものではなく、購入決定を行う際の判断材料とすべきではありません。このドキュメントに記載されている特徴または機能の開発、リリースおよび時期については、オラクルの裁量により決定されます。

このドキュメントには、ソフトウェアまたは印刷物などの形式を問わず、オラクルが独占的な権利を有する財産的情報が含まれています。この機密資料へのアクセスと使用は、お客様とオラクルとの間で締結され、お客様が遵守に同意した、Oracle Master Agreement、Oracle License and Oracle Services Agreement (オラクル・ライセンスおよびサービスに関する契約書)、Oracle PartnerNetwork Agreement、Oracle Distribution Agreementまたはその他のライセンス契約の条件に従うものとします。このドキュメントとその内容の開示、コピー、複製および配布には、オラクルによる事前の承諾を必要とします。このドキュメントはライセンス契約の一部となるものではなく、オラクルおよびその子会社や関連会社との契約を構成するものではありません。

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

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

Oracle Supportへのアクセス

サポートをご契約のお客様には、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を参照してください。