Oracle® Fusion Middleware Oracle Entitlements Server開発者ガイド

11gリリース1 (11.1.2)

B71698-01(原本部品番号:E27154-01)

目次

例一覧

図一覧

表一覧

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

はじめに

- 対象読者

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

- 関連ドキュメント

- 表記規則

1 ポリシー・モデルの使用方法

- 1.1 ポリシー要素の確認

- 1.2 単純なポリシーの構成

- 1.3 単純なポリシーへの詳細なオブジェクトの追加

- 1.3.1 アプリケーション・ロールの作成

- 1.3.2 ロール・マッピング・ポリシーの定義

- 1.3.3 条件の追加

- 1.3.4 権限セットの移入

- 1.3.5 義務の作成

- 1.4 ロールを使用したポリシーの実装

2 プログラムによるポリシーの作成

- 2.1 Java APIの使用方法

- 2.1.1 ポリシー・オブジェクトの作成

- 2.1.2 ポリシー・オブジェクトの変更

- 2.1.3 ポリシー・オブジェクトの削除

- 2.1.4 ポリシー・オブジェクトの検索

- 2.2 データ型の使用方法

- 2.3 単純なポリシーの実行

- 2.3.1 ポリシー・ストアへのアクセス

- 2.3.2 アプリケーション・ポリシーの作成

- 2.3.3 リソース・タイプの定義

- 2.3.4 リソースのインスタンス化

- 2.3.5 リソースへのアクションの関連付け

- 2.3.5.1 ResourceEntryの使用方法

- 2.3.5.2 ResourceNameExpressionの使用方法

- 2.3.6 ポリシー・ルールの指定

- 2.3.7 プリンシパルの指定

- 2.3.8 ポリシーの定義

- 2.4 単純なポリシー用の詳細な要素の作成

- 2.4.1 アプリケーション・ロールの作成

- 2.4.2 ロール・マッピング・ポリシーの作成

- 2.4.3 属性と関数定義の作成

- 2.4.3.1 属性定義の作成

- 2.4.3.2 カスタム関数定義の作成

- 2.4.4 権限セットの定義

- 2.4.5 条件の定義

- 2.4.5.1 ブール式の作成

- 2.4.5.2 カスタム関数式の作成

- 2.4.6 義務の追加

- 2.5 サンプル・コードへのアクセス

3 ポリシー・オブジェクトのプログラムによる管理

- 3.1 Oracle Entitlements Serverを使用したポリシーの管理

- 3.2 範囲レベルを使用したポリシー・オブジェクトの管理

- 3.2.1 PolicyStoreの範囲で作成されたオブジェクトの管理

- 3.2.2 ApplicationPolicy範囲内でのオブジェクトの管理

- 3.2.2.1 PolicyDomainEntryオブジェクトの管理

- 3.2.2.2 ResourceTypeEntryオブジェクトの管理

- 3.2.2.3 AppRoleEntryオブジェクトの管理と付与

- 3.2.2.4 ロール・マッピング・ポリシー(RolePolicyEntry)オブジェクトの管理

- 3.2.2.5 AttributeEntryおよびFunctionEntryオブジェクトの管理

- 3.2.2.6 ResourceEntryオブジェクトの管理

- 3.2.2.7 権限セットの管理

- 3.2.2.8 ポリシーの管理

- 3.2.3 PolicyDomainEntry範囲内でのオブジェクトの管理

4 ポリシーの配布

- 4.1 ポリシー配布について

- 4.1.1 集中型ポリシー配布コンポーネントの使用方法

- 4.1.2 ローカル・ポリシー配布コンポーネントの使用

- 4.2 配布モードの定義

- 4.2.1 制御された配布

- 4.2.2 制御されない配布

- 4.3 セキュリティ・モジュールの構成とバインディング

- 4.3.1 セキュリティ・モジュールの構成の管理

- 4.3.2 セキュリティ・モジュール・バインディングの管理

- 4.4 ポリシー配布の開始

5 ポリシー管理の委任

- 5.1 管理の委任

- 5.2 範囲と委任の粒度の管理

- 5.3 権限の割当て

- 5.4 デフォルトの管理ロールの使用方法

- 5.5 管理ロールの作成

- 5.5.1 管理ロールの作成

- 5.5.2 管理ロールへのアクションとリソース(権限)の割当て

- 5.5.3 管理ロールへのプリンシパルの割当て

- 5.5.4 プリンシパルの管理リソースの取得

- 5.6 管理者ロールの管理

- 5.7 ポリシー・ドメインの委任

6 認可コールと決定の処理

- 6.1 PEP APIの使用方法

- 6.1.1 PEP APIについて

- 6.1.1.1 PEP APIの使用

- 6.1.1.2 様々なPEP APIリクエストの使用方法

- 6.1.1.3 PEP APIサブジェクトの指定

- 6.1.1.4 認可リクエスト文字列の書式

- 6.1.1.5 問合せを使用した認証情報の取得

- 6.1.2 Java用PEP APIの使用方法

- 6.1.2.1 Java PEP APIサブジェクトの取得

- 6.1.2.2 単純なJava PEP API認可リクエストの実行

- 6.1.2.3 Java PEP API義務の処理

- 6.1.2.4 Java PEP API一括認可リクエストの実行

- 6.1.2.5 Java PEP API問合せリクエストの実行

- 6.1.2.6 Java PEP APIの構成

- 6.1.3 .NET用PEP APIの使用方法

- 6.1.3.1 .NET PEP APIサブジェクトの取得

- 6.1.3.2 単純なNET PEP API認可リクエストの実行

- 6.1.3.3 .NET PEP API義務の処理

- 6.1.3.4 .NET PEP API一括認可リクエストの実行

- 6.1.3.5 .NET PEP API問合せリクエストの実行

- 6.1.3.6 .NET PEP APIの構成

- 6.2 checkPermission()コールの実行

- 6.3 XACMLゲートウェイの使用方法

7 機能の拡張

- 7.1 属性リトリーバの使用

- 7.1.1 属性リトリーバについて

- 7.1.2 カスタム属性リトリーバの作成

- 7.1.3 カスタム属性リトリーバの実装

- 7.1.3.1 属性値の直接取得

- 7.1.3.2 ハンドルを使用した属性値の取得

- 7.1.4 カスタム属性リトリーバに対するOracle Entitlements Serverの構成

- 7.2 カスタム関数の開発

- 7.2.1 カスタム関数の実装

- 7.2.2 メタデータ情報に対するInspectableFunctionの使用方法

8 標準タグ・ライブラリの使用方法

- 8.1 タグ・ライブラリの使用方法

- 8.2 機能タグの定義

- 8.2.1 isAccessAllowedタグ

- 8.2.2 isAccessNotAllowedタグ

- 8.2.3 getUserRolesタグ

- 8.2.4 isUserInRoleタグ

- 8.3 アシスタント・タグの定義

- 8.3.1 setSecurityContextタグ

- 8.3.2 attributeタグ

- 8.3.3 then/elseタグ

索引

例一覧

- 2-1 createApplicationPolicy()メソッドの使用方法

- 2-2 createResourceType()メソッドの使用方法

- 2-3 createResource()メソッドの使用方法

- 2-4 ResourceEntryによるResourceActionsEntryの作成

- 2-5 ResourceNameExpressionによるResourceActionsEntryの作成

- 2-6 PolicyRuleEntryの作成

- 2-7 createPolicy()の例の使用方法

- 2-8 アプリケーション・ロールの作成

- 2-9 アプリケーション・ロールへのプリンシパルの割当て

- 2-10 アプリケーション・ロール階層の適用

- 2-11 createRolePolicyメソッドの使用方法

- 2-12 動的な属性定義の作成

- 2-13 カスタム関数定義の作成

- 2-14 PermissionSetEntryの作成

- 2-15 BooleanExpressionEntryの定義

- 2-16 BooleanExpressionEntryの作成

- 3-1 jps-config.xmlでのポリシー・ストアの定義

- 3-2 deleteApplicationPolicy()メソッドの使用方法

- 3-3 deletePolicyDomain()メソッドの使用方法

- 3-4 modifyPolicyDomain()メソッドの使用方法

- 3-5 getPolicyDomain()メソッドの使用方法

- 3-6 deleteResourceType()メソッドの使用方法

- 3-7 deleteAppRole()メソッドの使用方法

- 3-8 deleteRolePolicy()メソッドの使用方法

- 3-9 modifyRolePolicy()メソッドの使用方法

- 3-10 getAttribute()メソッドの使用方法

- 3-11 deleteAttribute()メソッドの使用方法

- 3-12 getFunction()メソッドの使用方法

- 3-13 deleteFunction()メソッドの使用方法

- 3-14 getResource()メソッドの使用方法

- 3-15 deleteResource()メソッドの使用方法

- 3-16 modifyResource()メソッドの使用方法

- 3-17 PermissionSetEntryの変更

- 3-18 deletePermissionSet()メソッドの使用方法

- 3-19 modifyPolicy()メソッドの使用方法

- 3-20 deletePolicy()メソッドの使用方法

- 4-1 createSecurityModule()メソッドの使用方法

- 4-2 bindSecurityModule()メソッドの使用方法

- 4-3 getSecurityModule()メソッドの使用方法

- 4-4 deleteSecurityModule()メソッドの使用方法

- 4-5 getBoundSecurityModules()メソッドの使用方法

- 4-6 getBoundApplications()メソッドの使用方法

- 4-7 unbindSM()メソッドの使用方法

- 4-8 distributePolicy()メソッドの使用方法

- 5-1 deleteAdminRole()メソッドの使用方法

- 5-2 getAdminRole()メソッドの使用方法

- 5-2 createPolicyDomain()メソッドの使用方法

- 6-1 Java PEP APIリクエストでの認可済サブジェクトの使用方法

- 6-2 Java PEP APIリクエストでのWebLogic Serverサブジェクトの使用方法

- 6-3 Java PEP APIリクエストでのWebsphere Application Serverサブジェクトの使用方法

- 6-4 リソースに対するJava PEP API認可のリクエスト

- 6-5 PEP APIリクエストおよび解析レスポンスの実行

- 6-6 例6-5から返された義務

- 6-7 Java PEP APIによる一括認可のリクエスト

- 6-8 Java PEP APIの問合せタイプの定義

- 6-9 新しいJava PEP APIのリソース・タイプの定義

- 6-10 Java PEP APIによるリソースおよび子への詳細問合せ

- 6-11 Java PEP APIによるimmediateの検索範囲の問合せリクエスト

- 6-12 Java PEP APIによるchildrenの検索範囲の問合せリクエスト

- 6-13 Java PEP APIによる許可/拒否の結果と義務の問合せリクエスト

- 6-14 jps-config.xmlのサンプル・ファイル

- 6-15 リソースに対する.NET PEP API認可のリクエスト

- 6-16 文字列サブジェクトによる.NET PEP API認可のリクエスト

- 6-17 UserPrincipalサブジェクトによる.NET PEP API認可のリクエスト

- 6-18 .NET PEP APIによる単一の認可と義務のリクエスト

- 6-19 一括認可のリクエスト

- 6-20 許可されたリソース・アクション・ペアのリストに対する.NET問合せ

- 6-21 拒否されたリソース・アクション・ペアのリストに対する.NET問合せ

- 6-22 すべてのリソース・アクション・ペアのリストに対する.NET問合せ

- 6-23 リソースとその子に対する認可の結果のリクエスト

- 6-24 checkPermission()メソッドの使用方法

- 6-25 XACMLゲートウェイのセッションを確立するサンプル・コード

- 6-26 プリンシパル情報によりセッションを確立するサンプル・コード

- 6-27 XACMLリクエストの作成

- 6-28 XACML 2.0認可リクエスト

- 6-29 XACML 2.0認可レスポンス

- 7-1 getAttributeValue()メソッドの実装

- 7-2 getAttribute()メソッドの使用方法

- 7-3 jps-config.xmlのserviceProvidersセクション

- 7-4 jps-config.xmlのserviceProvidersセクション

- 7-5 jps-config.xmlのjpsContextセクション

- 7-6 カスタム関数のサンプル・コード

- 7-7 DataType引数を返すカスタム関数のサンプル・コード

- 7-8 getArgMetadata()メソッドのサンプル・コード

- 7-9 getArgValues()メソッドのサンプル・コード

- 7-10 isValidArgValue()メソッドのサンプル・コード

- 8-1 isAccessAllowedタグの例

- 8-2 isAccessNotAllowedタグの例

- 8-3 getUserRolesタグの例

- 8-4 isUserInRoleタグの例

- 8-5 setSecurityContextタグの例

- 8-6 attributeタグの例

図一覧

- 2-1 ポリシー・オブジェクトにマップされたポリシー・コンポーネント

- 4-1 Oracle Entitlements Serverポリシー配布コンポーネントの使用方法

- 4-2 セキュリティ・モジュール・ポリシー配布コンポーネントの使用方法

- 5-1 管理ロール・モデル

- 6-1 はオープンAZ APIおよびPEP API間の関係

表一覧

- 2-1 複雑なSearchQueryパラメータの使用方法

- 2-2 データ型の説明

- 2-3 データ型に対する関数のカテゴリ

- 2-4 ResourceNameExpressionオブジェクトの照合

- 2-5 ResourceNameExpressionの例

- 2-6 プログラムによるプリンシパルの指定

- 5-1 リソース名のオプション

- 6-1 PEP API認可リクエスト・タイプについて

- 6-2 PEP API問合せのタイプ

- 7-1 AttributeRetrieverV2インタフェースのメソッド

- 8-1 isAcessAllowedタグの定義

- 8-2 isAccessNotAllowedタグの定義

- 8-3 getUserRolesタグの定義

- 8-4 isUserInRoleタグの定義

- 8-5 setSecurityContextタグの定義

- 8-6 attributeタグの定義

Oracle® Fusion Middleware

Oracle Entitlements Server開発者ガイド

11gリリース1 (11.1.2)

B71698-01(原本部品番号:E27154-01)

2012年7月

Oracle Fusion Middleware Oracle Entitlements Server開発者ガイド11gリリース1 (11.1.2)

B71698-01

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

原本著者:  Michael Teger

原本協力者

原本協力者:

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

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

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

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

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

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

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

はじめに

Oracle Fusion Middleware Oracle Entitlements Server開発者ガイドでは、使用可能なアプリケーション・プログラミング・インタフェース(API)を使用した、認可ポリシーの作成方法、認可の決定のリクエスト方法および管理の委任方法について説明します。さらに、ポリシー・モデルに関する情報や、ポリシー・オブジェクトを作成するためのAPIの使用方法についても説明します。

対象読者

このマニュアルは、Oracle Entitlements Server開発ツールを使用して、組織の保護されたリソースへのアクセスを制御する技術者の方を対象としています。このアクセス制御には、プログラムによる認可の結果のリクエスト、認可またはロール・マッピング・ポリシーの作成、カスタムのセキュリティ・モジュールおよび属性リトリーバの開発、ポリシー・オブジェクトの管理などがあります。

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

オラクル社は、障害のあるお客様にもオラクル社の製品、サービスおよびサポート・ドキュメントを簡単にご利用いただけることを目標としています。オラクル社のドキュメントには、ユーザーが障害支援技術を使用して情報を利用できる機能が組み込まれています。HTML形式のドキュメントで用意されており、障害のあるお客様が簡単にアクセスできるようにマークアップされています。標準規格は改善されつつあります。オラクル社はドキュメントをすべてのお客様がご利用できるように、市場をリードする他の技術ベンダーと積極的に連携して技術的な問題に対応しています。オラクル社のアクセシビリティへの取組みの詳細は、Oracle Accessibility ProgramのWebサイトhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=docaccを参照してください。

ドキュメント内のサンプル・コードのアクセシビリティについて

スクリーン・リーダーは、ドキュメント内のサンプル・コードを正確に読めない場合があります。コード表記規則では閉じ括弧のみを行に記述する必要があります。しかし、一部のスクリーン・リーダーは括弧のみの行を読まない場合があります。

外部Webサイトのドキュメントのアクセシビリティについて

このドキュメントにはオラクル社およびその関連会社が所有または管理しないWebサイトへのリンクが含まれている場合があります。オラクル社およびその関連会社は、それらのWebサイトのアクセシビリティに関しての評価や言及は行っておりません。

Oracleサポートへのアクセス

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

関連ドキュメント

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

- Oracle Fusion Middlewareのリリース・ノート

- Oracle Fusion Middleware Oracle Identity Managementインストレーション・ガイド

- Oracle Fusion Middleware Oracle Entitlements Server管理者ガイド

- Oracle Fusion Middleware Oracle Entitlements Server管理Java APIリファレンス

- Oracle Fusion Middleware Oracle Entitlements Server PDP拡張Java APIリファレンス

- Oracle Fusion Middleware Oracle Entitlements Server .NET APIリファレンス

表記規則

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

規則

意味

太字

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

イタリック体

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

固定幅フォント

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

1 ポリシー・モデルの使用方法

Oracle Entitlements Serverでは、モデルを使用してポリシーを構成する要素とその使用方法を定義し、ポリシーを作成します。ポリシー・モデルの詳細は、『Oracle Fusion Middleware Oracle Entitlements Server管理者ガイド』を参照してください。さらに、モデルのコンポーネントの用語集や、ポリシーの実装の使用例が含まれています。この章では、管理APIを使用したOracle Entitlements Serverポリシー・モデルの実装方法について説明します。この項の内容は、次のとおりです。

- 1.1項「ポリシー要素の確認」

- 1.2項「単純なポリシーの構成」

- 1.3項「単純なポリシーへの詳細なオブジェクトの追加」

- 1.4項「ロールを使用したポリシーの実装」

1.1 ポリシー要素の確認

ポリシーは、リクエスト時に、リクエストしているプリンシパルのプロファイルに基づいき、保護対象のターゲット・リソースに対して、結果(GRANTまたはDENY)を返すために作成します。高いレベルから、ポリシーは、結果、プリンシパル、ターゲット・リソース、リソースに許可されたアクション、およびオプションの条件間の関係を定義します。ポリシーが、アクセスのリクエストに対して適用可能となるのは、リクエストのパラメータがポリシーに指定されたものと一致した場合です。次のポリシーの構文について考えてみます(『Oracle Fusion Middleware Oracle Entitlements Server管理者ガイド』でも説明しています)。

GRANT the SupportManagerEast role MODIFY access to the Incidents servlet
if the request is made from an IP address of 229.188.21.21; return Obligation
(“send log message if access is granted")

図1-1は、これらの要素が、(ポリシー・モデルにおいて)ポリシーに関係するオブジェクトに、どのようにマップされるかを示しています。これらのオブジェクトは、ポリシーをプラグラムによって作成するために使用できます。

図2-1 ポリシー・オブジェクトにマップされたポリシー・コンポーネント

「図1-1 ポリシー・オブジェクトにマップされたポリシー・コンポーネント」の説明

結果(PolicyRuleEntry.EffectType)およびオプションの条件(RuleExpressionEntry)は、ポリシー・ルール(PolicyRuleEntry)で定義されています。ターゲット・リソース(ResourceEntry)とそこで実行可能なアクションはResourceActionsEntryで定義されています。リクエストするユーザー、グループまたはロールはプリンシパル(PrincipalEntry)として定義されています。さらに、プリンシパルには、AppRoleEntryで定義されたロールが割当済です。オプションの義務(ObligationEntry)は、コール元に決定とともに返される情報を指定します。これは、決定の実行時に評価されます(決定の評価時ではありません)。この情報は、コール元で使用される場合と使用されない場合があり、さらに決定自体に影響する場合があります。これらのプログラム・オブジェクトは、ポリシー・ストア(PolicyStore)のインスタンスに格納されています。詳細は、1.2項「単純なポリシーの構成」および2.3.1項「ポリシー・ストアへのアクセス」を参照してください。

- 認可ポリシーは、アプリケーション・ソフトウェア・コンポーネントと、アプリケーション・ビジネス・オブジェクトの両方へのアクセスを制御します。詳細は、第2章「プログラムによるポリシーの作成」を参照してください。

- ロール・マッピング・ポリシーは、プリンシパルにどのようにロールを付与するか、または拒否するかを制御するルールを定義します。詳細は、1.3.2項「ロール・マッピング・ポリシーの定義」を参照してください。

第2章「プログラムによるポリシーの作成」の関連情報も参照してください。

1.2 単純なポリシーの構成

単純な認可ポリシーを構成するには要素(またはポリシー・オブジェクト)を特定の順序で作成する必要があります。たとえば、ResourceEntryオブジェクトは、ResourceTypeEntryオブジェクトを定義した後にのみ作成できます。単純なポリシーは次に説明する順番で構成できます。

1. ポリシー・ストアにアクセスします。
PolicyStoreオブジェクトは、ポリシー・ストア全体を表します。ポリシー管理アクティビティはすべて、管理権限を持つ管理ユーザーがポリシー・ストアへのハンドルを取得してポリシーを管理する場合にのみ開始できます。ユーザーには、少なくとも管理ロールを1つ割り当てる必要があります。コールが認可されていないロールのメソッドには、エラーが返されます。詳細は、2.3.1項「ポリシー・ストアへのアクセス」を参照してください。

注意:

ポリシー・ストアは、Oracle Fusion Middlewareのインストール時に作成および構成されます。デフォルトのポリシー・ストア・ファイルは、system-jazn-data.xmlという名前で、$DOMAIN_HOME/config/oeswlssmconfig/ディレクトリにあります。詳細は、『Oracle Fusion Middleware Oracle Identity Managementインストレーション・ガイド』を参照してください。

2. ApplicationPolicyを作成します。
ApplicationPolicyオブジェクトはPolicyStoreオブジェクトの子であり、特定のアプリケーションのコンポーネントを保護するポリシーおよび関連情報の全体的なコンテナとして作成する必要があります。必要に応じて任意の数のApplicationPolicyオブジェクトを作成できますが、保護するアプリケーションごとに1つ作成することをお薦めします。createApplicationPolicyメソッドを使用すると、ApplicationPolicyオブジェクトのハンドルが返されます。詳細は、2.3.2項「アプリケーション・ポリシーの作成」を参照してください。

3. ResourceTypeEntryを作成します。
ResourceTypeEntryオブジェクトには、1つまたは複数のリソース属性と、特定の種類のリソースで実行できるすべての有効なアクションの定義を指定します。このアクションは標準のアクション(URLへのGETおよびPOST)の場合もビジネス・オブジェクトでのカスタム・アクション(銀行口座間の振替)の場合もあります。次のResourceTypeEntryオブジェクトとその有効なアクションについて考えてみます。

- テキスト・ファイルは「読取り」、「書込み」、「コピー」、「編集」、「削除」をサポートできます。

- 銀行の当座預金口座アプリケーションでは、預入れ、引出し、残高確認、履歴の確認、普通口座への振替、または普通口座からの振替がサポートされます。

アクションは、ResourceTypeEntryから作成された保護されたResourceEntryインスタンスにアクセスしたときに付与または拒否されます。ResourceTypeEntryを作成するには、オブジェクトの作成、読取り、更新および変更を提供するResourceTypeManagerをコールします。詳細は、2.3.3項「リソース・タイプの定義」を参照してください。

4. ResourceTypeEntryからResourceEntryを開始します。
特定の保護ターゲット(ResourceEntry)はResourceTypeEntryオブジェクトからインスタンス化されます。ResourceManagerは、ResourceEntryを作成、読取り、更新および削除するメソッドを提供します。ResourceEntryオブジェクトは、保護されたターゲットを表します(たとえば、アプリケーション)。さらにResourceTypeEntryを参照し、PolicyDomainEntryに従って作成されます。PolicyDomainEntryオブジェクトが指定されていない場合は、デフォルトのPolicyDomainEntryオブジェクトに従って作成されます。詳細は、2.3.4項「リソースのインスタンス化」を参照してください。

注意:

PolicyDomainEntrynisは編成構造です。デフォルトのPolicyDomainEntryのインスタンスを取得することはできません。デフォルトのPolicyDomainEntryでオブジェクトを取得するには、ApplicationPolicyを取得してオブジェクトのManagerインタフェースを使用します。

5. ResourceActionsEntryインタフェースを使用して、適用可能なアクションをResourceEntryに関連付けます。
ResourceActionsEntryオブジェクトを作成して、ResourceEntryオブジェクトで実行可能なアクションを定義します。ResourceActionsEntryオブジェクトで定義されたアクションのセットは、そのオブジェクトが参照するResourceTypeEntryで定義済の有効なアクションのセットのサブセットです。ResourceActionsEntryオブジェクトは直接ポリシーに追加するか、1つ以上をPermissionSetEntryに追加できます。概要は、1.3.4項「権限セットの移入」を参照してください。ResourceActionsEntryオブジェクトをPermissionSetEntryオブジェクトに追加するプログラミングの詳細は、2.4.4項「権限セットの定義」を参照してください。

6. PolicyEntryを作成します。
この手順の内容は次のとおりです。

1. PolicyRuleEntryオブジェクトで結果(GRANTまたはDENY)を指定します。
詳細は、2.3.6項「ポリシー・ルールの指定」を参照してください。

2. PrincipalEntryオブジェクトでポリシー・プリンシパルとしてユーザーまたはグループを指定します。
詳細は、2.3.7項「プリンシパルの指定」を参照してください。ポリシー・プリンシパルとしてアプリケーション・ロールを指定することもできます。詳細は、1.3.1項「アプリケーション・ロールの作成」を参照してください。

3. ターゲット・リソース・インスタンスと適用可能なアクションを含んだResourceActionsEntryオブジェクトを使用します。
詳細は、2.3.5項「リソースへのアクションのポリシー・ルールの関連付け」を参照してください。

4. PolicyManagerをコールし、PolicyEntryを作成します。
詳細は、2.3.8項「ポリシーの定義」を参照してください。

このシーケンスと、ポリシー・オブジェクトの作成に関する情報は、第2章「ポリシーのプログラムによる作成」で追加情報とともに再度説明します。ポリシー・オブジェクトの管理(取得、変更および削除など)に関する詳細は、第3章「ポリシー・オブジェクトのプログラムによる管理」を参照してください。

1.3 単純なポリシーへの詳細なオブジェクトの追加

1.2項「単純なポリシーの構成」では、ポリシーを作成するために必要な最小限のコンポーネントについて説明しました。ここでは、単純なポリシーに追加して詳細な調整を可能にするオブジェクトの情報について説明します。

- 1.3.1項「アプリケーション・ロールの作成」

- 1.3.2項「ロール・マッピング・ポリシーの定義」

- 1.3.3項「条件の追加」

- 1.3.4項「権限セットの移入」

- 1.3.5項「義務の作成」

これらのオブジェクトの作成に関する追加のプログラムの情報は、第2章「ポリシーをプログラムによる作成」を参照してください。これらのオブジェクトの取得、変更および削除に関する追加のプログラムの情報は第3章「ポリシー・オブジェクトのプログラムによる管理」を参照してください。

1.3.1 アプリケーション・ロールの作成

アプリケーション・ロールはユーザー、グループおよび他のアプリケーション・ロールの集合です。たとえば、特定のターゲット・アプリケーションに必要なすべての権限をアプリケーション・ロールに付与できます。アプリケーション・ロールを作成したら、そのロールのメンバーシップをユーザーに付与することで、ユーザーに静的に割り当てることができます。あるいは、ロール・マッピング・ポリシーでロールを参照することで、ポリシー自体で定義された権限がポリシーのプリンシパルに付与されるため、動的に割り当てることもできます。アプリケーション・ロールはエンタープライズ・ユーザー、グループまたはアイデンティティ・ストアのロール、またはポリシー・ストアの別のアプリケーション・ロールに割り当てることができます。1つのターゲット・アプリケーションが複数の異なるロールを持ち、よりきめの細かいアクセスのために、それぞれのロールに異なる権限のセットを割り当てることが可能です。

アプリケーション・ロールはApplicationPolicyレベル(したがってその名前)で定義されます。AppRoleEntryオブジェクトは、アプリケーション・ロールを表します。AppRoleManagerは、アプリケーション・ロールの作成、削除、変更および検索するためのメソッドを提供し、さらにロールのメンバーシップを付与および取り消すメソッドを提供します。メンバーシップは、grantAppRole()メソッドの使用により静的に付与するか、ロール・マッピング・ポリシーにより動的に付与できます。ロール・マッピング・ポリシーでは、ロールをユーザーに割り当て、認可ポリシーではロールのアクセス権限を定義します。

注意:

ロール・マッピング・ポリシーの詳細は、1.3.2項「ロール・マッピング・ポリシーの定義」を参照してください。

アプリケーション・ロールはロールの継承および階層を使用します。継承パターンは、エンタープライズ・ユーザーまたはグループあるいはアイデンティティ・ロールがアプリケーション・ロールに割り当てられる(ロール・マッピング・ポリシーを使用)ようなもので、ロール・マッピング・ポリシーにより禁止されなければ、子ロールも継承します。たとえば、アプリケーション・ロール1がアプリケーション・ロール2に付与された場合、アプリケーション・ロール2はアプリケーション・ロール1のメンバーです。アプリケーション・ロール2として定義されたすべてのサブジェクトは、継承を通じてアプリケーション・ロール1にも定義されます(他のロール・マッピング・ポリシーによって禁止されていない場合)。AppRoleEntryがポリシー・プリンシパルとして参照されるとき、ロールに割り当てられたすべてのユーザーのリソースへのアクセスは、ポリシーにより管理されます。

注意:

アプリケーション・ロールは、ロール・マッピング・ポリシーによって他のアプリケーション・ロールに割り当てることはできません。アプリケーション・ロール間のメンバーシップは、静的でのみ定義できます。

詳細は、2.4.1項「アプリケーション・ロールの作成」を参照してください。

1.3.2 ロール・マッピング・ポリシーの定義

保護されたリソースへのアクセスは、認可ポリシーにリソースと、そのリソースにアクセス可能な特定のユーザーまたはグループを定義することで付与できます。ただし、実行時に認可の前に動的にユーザーを決定する場合は、アプリケーション・ロールを定義し、保護されたリソースとアプリケーション・ロールを認可ポリシーで設定し、ロール・マッピング・ポリシーを作成することでもアクセスを付与できます。

1.3.1項「アプリケーション・ロールの作成」の説明のとおり、アプリケーション・ロールへのメンバーシップは、grantAppRole()メソッドの使用により静的に付与するか、ロール・マッピング・ポリシー(RolePolicyEntry)により動的に付与できます。アプリケーション・ロールはロール・マッピング・ポリシーのプリンシパルとして参照され、ユーザーに定義済のリソースへのアクセス権を付与できますが、ロール・マッピング・ポリシーは認可が決定される前に解決される必要があります。この解決では、アクセスのリクエスト・ユーザーをこのアプリケーション・ロールに割り当てることができるかどうかという質問に対応します。リソースへのアクセスのリクエストが受信されると、適用された認可ポリシーが取得され、評価されます。ポリシーがアプリケーション・ロールをプリンシパルとして参照している場合、アクセスの決定の前にそれらのロールが評価される必要があります。

また、ロール・マッピング・ポリシー、認可ポリシーあるいはこれら両方に日中の時刻や週の曜日などの条件を定義することで、リソースへのアクセスを限定する制限を適用できます。詳細は、1.3.3項「条件の追加」を参照してください。ロール・マッピング・ポリシーの詳細は、1.4項「ロールを使用したポリシーの実装」および2.4.2項「ロール・マッピング・ポリシーの作成」を参照してください。

1.3.3 条件の追加

認可ポリシーまたはロール・マッピング・ポリシーには、追加の制約を設定する方法で条件を追加できます。条件は式の形で作成され、trueかfalse(ブール値)かが決定されて、次のいずれかの結果になります。

- 式の結果がtrueの場合、ポリシーの条件は満たされ、PolicyRuleEntryが適用されます。

- 式の結果がtrueでない場合、ポリシーは適用されません。

条件はなんらかのユーザー、リソースまたはシステム属性の値をテストするブールの複雑な組合せであるか、複雑なビジネス・ロジックを評価するカスタムのJava評価関数である可能性があります。条件を作成して属性や関数を定義するには、ExtensionManagerをコールし、利用可能なメソッドを使用して、ポリシーを参照するための次のいずれかのオブジェクトを作成します。

- AttributeEntry(ポリシー・ルールに動的に追加可能な名前/値のペア)

- FunctionEntry(外部で実装されたロジック)

ポリシー評価時に、条件を設定する手段としてこれらのいずれかをPolicyRuleEntryに追加できます。詳細は、2.4.5項「条件の定義」を参照してください。

1.3.4 権限セットの移入

ResourceActionsEntryオブジェクトは、特定の保護されたターゲット(リソース)に実行可能なアクションを関連付けます。ResourceActionsEntryオブジェクトは、単純な認可ポリシーを作成するときに指定します。また、1つ以上のResourceActionEntryオブジェクトにPermissionSetEntry(資格とも呼ばれます)を移入することでより複雑なポリシーを作成することもできます。

移入するには、PermissionSetManagerをコールし、PermissionSetEntryを初期化して、1つ以上のResourceActionsEntryオブジェクトを追加します。これによりPermissionSetEntryが、PolicyEntryオブジェクトで参照されます。詳細は、2.4.4項「プロパティ・セットの定義」を参照してください。

1.3.5 義務の作成

義務にはアクセスの決定と一緒にコール側アプリケーションに返される追加の情報を指定します。この情報がポリシー実行中に考慮されるかどうかは、アプリケーションにより定義された設定に基づきます。義務の情報は、有効なポリシーの結果(GRANTまたはDENY)とともに返されます。たとえば、アクセスのリクエストが拒否された理由を義務として返すことができます。異なるタイプの義務にはメッセージの送信を含めることができます。たとえば、特定の金額が当座預金口座から引き出される場合に、口座の名義人の登録携帯電話にテキスト・メッセージを送信します。

注意:

条件がfalseと評価された場合、義務はコール側に送信されません。

義務を指定するには、ObligationEntryオブジェクトを作成します。このオブジェクトは、義務の引数を形成する一連の属性を含みます。これによりObligationEntryが、PolicyEntryオブジェクトで参照されます。詳細は、2.4.6項「義務の追加」を参照してください。

1.4 ロールを使用したポリシーの実装

1.3.2項「ロール・マッピング・ポリシーの定義」の説明のとおり、ユーザーおよびグループをアプリケーション・ロールへマッピングするときには、(直接ロール・メンバーシップを使用した)静的なマッピングと、(ロール・マッピング・ポリシーを使用した)動的なマッピングが可能です。ロール・マッピング・ポリシーは、プリンシパル(ユーザー、グループ)、オプションのターゲット(リソース、リソース名の式)および(オプションの)条件を含みます。ロールは、認可ポリシーを使用してアクセス権限にもマップできます。認可ポリシーには、プリンシパル(ユーザー、グループ、アプリケーション・ロール)、ターゲット(リソース、資格セット、リソース名の式)、ターゲットで実行可能なアクションおよび(オプションの)条件と義務を含めることができます。認可の評価では次の処理が実行されます。

1. プリンシパルに基づき、アプリケーション・ロールのリストは、静的ロール・メンバーシップと、適用可能なロール・マッピング・ポリシーのチェックにより決定されます。

2. プリンシパルとアプリケーション・ロールの結果リストに基づき、適用できるポリシーを検出するために、認可ポリシーのリストが評価されます。適用できるポリシーは、プリンシパル、一致するターゲットおよび条件の評価に基づきます。

3. 評価結果は、アルゴリズムを組み合せた拒否のオーバーライドに基づきます。

詳細は、2.4.1項「アプリケーション・ロールの作成」と2.4.2項「ロール・マッピング・ポリシーの作成」を参照してください。

2 プログラムによるポリシーの作成

Oracle Entitlements Serverには、ポリシーやポリシー・オブジェクトをプログラムによって作成するためのJavaアプリケーション・プログラミング・インタフェース(API)が含まれています。この章では、それらの様々なポリシー・オブジェクトをAPIを使用して作成する方法について説明します。この章には次の項目があります。

- Java APIの使用方法

- データ型の使用方法

- 単純なポリシーの実行

- 単純なポリシー用の詳細な要素の作成

- コード例へのアクセス

注意:

対応するWebLogic Scripting Tool (WLST)コマンドは、Oracle Fusion Middleware Oracle Entitlements Server管理者ガイドを参照してください。

2.1 Java APIの使用方法

The Oracle Entitlements Server Java APIは、第1章「ポリシー・モデルの使用方法」で説明されているポリシー・オブジェクトの作成、管理(読取り、変更、削除)および検索を行うために使用できます。ポリシー・オブジェクトは一般に、名前の最後がEntryのインタフェースです。oracle.security.jps.service.policystore.infoパッケージには、PolicyEntry、AppRoleEntryおよびPermissionSetEntryなど、多くのポリシー・オブジェクトが含まれています。oracle.security.jps.service.policystore.info.resourceパッケージには、ResourceEntry、ResourceTypeEntryおよびResourceActionsEntryなどが含まれています。ポリシー・オブジェクトを作成または管理するには、次の操作を行う必要があります。

1. ポリシー・ストアへのハンドルを取得します。
2.3.1項「ポリシー・ストアへのアクセス」を参照してください。

2. オブジェクトを作成する(または作成済の)アプリケーション・ポリシーを取得します。
2.3.2項「アプリケーション・ポリシーの作成」を参照してください。

注意:

これには、ポリシー・ドメインの取得が必要な場合と必要ない場合があります。詳細は、第5章「ポリシー管理の委任」を参照してください。

3. 適切なエンティティ管理インタフェースのインスタンスを取得します。エンティティ・マネージャを使用してポリシー・オブジェクトを作成および管理します。
oracle.security.jps.service.policystore.entitymanagerパッケージには、ResourceManager、PolicyManager、AppRoleManager、PermissionSetManagerなど、すべてのインタフェースが含まれています。

次の項では、ポリシー・オブジェクトに対して特定の操作を実行するためにどのようにAPIを使用できるかをより具体的に説明します。

- 2.1.1項「ポリシー・オブジェクトの作成」

- 2.1.2項「ポリシー・オブジェクトの変更」

- 2.1.3項「ポリシー・オブジェクトの削除」

- 2.1.4項「ポリシー・オブジェクトの検索」

詳細は、次のいずれかまたは両方のOracle Entitlements Server Java APIリファレンス・ガイドを参照してください。

- Oracle Fusion Middleware Oracle Entitlements Server管理Java APIリファレンス

- Oracle Fusion Middleware Oracle Entitlements Server PDP拡張Java APIリファレンス

2.1.1 ポリシー・オブジェクトの作成

特定のポリシー・オブジェクトを作成するには、ポリシー・ストアと該当するエンティティ・マネージャ・インタフェースのインスタンスへのハンドルを取得して、createメソッドを使用します。ポリシー・オブジェクトには、Name、Display Name、Descriptionなどの共通の要素があり、作成時にはこれらを定義する必要があります。作成しているオブジェクトの型固有のその他の要素も定義する必要があります。createメソッドの例とパラメータの説明は、2.3項「単純なポリシーの実行」および2.4項「単純なポリシー用の詳細な要素の作成」を参照してください。

2.1.2 ポリシー・オブジェクトの変更

特定のポリシー・オブジェクトを変更するには、ポリシー・ストアへのハンドルを取得して、新しいオブジェクトを作成するか、既存のものを検索してオブジェクトを取得します。オブジェクトのインスタンスはメモリー内に配置されます。オブジェクトのメソッドを使用して、メモリー内インスタンスを変更します。必要に応じて1つ以上をコールできます。変更が完了したら、オブジェクトのManagerインタフェースのインスタンスを取得して、modifyメソッドを使用し、メモリー内オブジェクトへの参照を渡します。これにより、ポリシー・ストアのオブジェクト自体に変更が伝播されます。これらの操作の例とパラメータの説明は、第3章「プログラムによるポリシー・オブジェクトの構成」を参照してください。

2.1.3 ポリシー・オブジェクトの削除

ポリシー・オブジェクトを削除するには、ポリシー・ストアと、該当するエンティティ・マネージャ・インタフェースのインスタンスへのハンドルを取得します。オブジェクトの定義済の名前をマネージャのdeleteメソッドに渡して削除します。また、一部のオブジェクトはカスケード削除が可能です。詳細は、第3章「ポリシー・オブジェクトのプログラムによる管理」を参照してください。

2.1.4 ポリシー・オブジェクトの検索

ポリシー定義で参照するポリシー・オブジェクトの取得には、しばしば検索が必要になります。ポリシー・オブジェクトを検索するには、単純な問合せまたは複雑な問合せを使用します。各Managerインタフェースには、問合せのタイプごとに単数または複数のgetメソッドがあります。単数のgetメソッドでは、オブジェクトの定義済の名前を渡すことで特定のポリシー・オブジェクトを検索および取得できます。複数のgetメソッドは、複雑なクエリを使用して複数のオブジェクトを取得するために使用します。複数のgetメソッドの場合は、oracle.security.jps.service.policystore.searchに定義されているSearchQueryクラスを使用して検索基準を渡します。表2-1は、標準のSearchQueryクラスのパラメータおよび説明を示しています。

表2-1 複雑なSearchQueryパラメータの使用方法

パラメータ

説明

policy_object.SEARCH_PROPERTY

問合せを実行するために使用するプロパティが定義された列挙。オブジェクト・タイプに応じて名前、表示名、説明などを格納できます。特定の検索タイプで許可されたプロパティは、Java APIリファレンスを参照してください。

negation

値にtrueまたはfalseのいずれかの値を取るブール。trueの場合NOT演算子が検索に適用されます。

operator

ComparatorTypeに次のいずれかを定義する列挙。

- EQUALITY

- GREATER THAN

- GREATER THAN OR EQUAL TO

- LESS THAN

- LESS THAN OR EQUAL TO

search string

検索に使用される文字列の値を取得します。

- 値がNULLの場合、一致は必ずANYになります。

- 値が与えられた場合は、アルゴリズムによって検索対象に対応する値が一致されます。

SearchQuery.MATCHER

検索文字列を検索対象の値と一致させる方法を定義する列挙です。次のいずれかを定義する必要があります。

- ANY — あらゆる非NULL値が検索文字列と一致します。(検索文字列がNULLの場合、一致は必ずANYになります。)これは、オブジェクト・タイプのすべてのインスタンスを取得するために使用します。

- BEGINS_WITH — オブジェクト・プロパティが検索文字列で始まる必要があります。

- CONTAINED_IN — オブジェクト・プロパティに検索文字列が含まれている必要があります。

- ENDS_WITH — オブジェクト・プロパティが検索文字列で終了する必要があります。

- EXACT — オブジェクト・プロパティが検索文字列と完全に一致する必要があります。

これらの検索操作の詳細は、第3章「ポリシー・オブジェクトのプログラムによる管理」を参照してください。特定のポリシー・オブジェクト固有のSearchQueryパラメータ情報についてはOracle Entitlements Server Java APIリファレンスを参照してください。

2.2 データ型の使用方法

Oracle Entitlements Serverのポリシー・ストアでは、XACML 2.0標準に準拠するために、追加のデータ型へのサポートが追加されています。使用されるデータ型は、データ自体の種類とOracle Entitlements Serverの解析方法によります。たとえば、特定のIPアドレスがあり、Oracle Entitlements Serverでマスクの処理にIPアドレスのセマンティクスを使用する場合は、OpssIPAddressデータ型を使用してください。OpssStringを使用した場合は、Oracle Entitlements ServerがIPアドレスとして処理する必要があると認識しません。表2-2に、データ型を示します。

表2-2 データ型の説明

データ型

説明

ANY_URI

Uniform Resource Identifier（URI）とオプションの記述子を表します。

BASE64_BINARY

任意のBase64エンコード・バイナリ・データを表します。

DATE_TIME

整数値化された年、月、日、時間および分のプロパティ、小数値化された2番目のプロパティおよびブール値のタイムゾーン・プロパティによってオブジェクトとして表示可能な値です。

DAYTIME_DURATION

座標系にグレゴリオ暦の年、月、日、時、分および秒の要素が指定されたオブジェクトとして時間間隔を表します。

DNS_NAME

ドメイン・ネームサービス(DNS)ホストの名前と、オプションのポートまたはポートの範囲を表します。

DOUBLE

IEEE倍精度64ビット浮動小数点型を表します。

HEX_BINARY

任意の16進エンコード・バイナリ・データを表します。

IP_ADDRESS

インターネット・プロトコル(IP)・アドレスを表します。

RFC822_NAME

電子メール・アドレスを表します。

X500_NAME

識別名(DN)を表します。

YEARMONTH_DURATION

時間間隔を表します。年数と月数を格納可能です。

BOOLEAN

trueまたはfalseを表します。

DATE

整数値化された年、月、日、時間および分のプロパティ、小数値化された2番目のプロパティおよびブール値のタイムゾーン・プロパティによってオブジェクトとして表示可能な値です。

INTEGER

有限長の10進数桁とオプションの先頭符号を表します。符号を省略した場合、正の数値が仮定されます。

STRING

文字列を表します。

TIME

特定の毎日繰り返す時刻を表します。PDPが制約または義務に指定された時刻を評価するとき、PDPがデプロイされたホストのローカル時間として解釈されます。

これらのデータ型は、次の用途に使用できます。

- データ型を属性(動的属性、リソース属性、カスタム属性リトリーバによって取得されたカスタム属性)に割り当てることによる属性の宣言

- ポリシー・ルールの制約

- 義務内での値の戻し

- 入力パラメータ

- 顧客/組込み関数の戻り値の宣言

表2-3に、各データ型で使用できる関数のカテゴリを示します。

表2-3 データ型に対する関数のカテゴリ

関数のカテゴリ

説明

LOGICAL_FUNCTION

ブール・データ型引数を処理します。

EQUALITY_COMPARISON_FUNCTION

2つの引数(整数または倍精度データ型)を比較して、それらが等しいかどうかについてのブール値を返します。

LESS_THAN_COMPARISON_FUNCTION

2つの引数(整数または倍精度データ型)を比較して、一方が他方よりも小さいかどうかについてのブール値を返します。

GREATER_THAN_COMPARISON_FUNCTION

2つの引数(整数または倍精度データ型)を比較して、一方が他方よりも大きいかどうかについてのブール値を返します。

LESS_THAN_EQUAL_COMPARISON_FUNCTION

2つの引数(整数または倍精度データ型)を比較して、一方が他方よりも小さいまたは等しいかどうかについてのブール値を返します。

GREATER_THAN_EQUAL_COMPARISON_FUNCTION

2つの引数(整数または倍精度データ型)を比較して、一方が他方よりも大きいまたは等しいかどうかについてのブール値を返します。

TYPE_IS_IN_EXISTENCE_FUNCTION

HAS_VALUE_EXISTENCE_FUNCTION

REGEXP_FUNCTION

VALID_FOR_FUNCTION

ARITHMETIC_FUNCTION

IntegerまたはDoubleデータ型の2つの引数を取得し、IntegerまたはDoubleデータ型を返します。

STRING_CONVERSION_FUNCTION

文字列データ型を取得し、定義に従って変換します。

NUMERIC_CONVERSION_FUNCTION

IntegerまたはDoubleデータ型の1つの引数を取得し、対応するIntegerまたはDoubleデータ型を返します。

DATE_TIME_ARITHMETIC_FUNCTION

日時データ型を使用した算術演算を実行します。

STRING_FUNCTION

文字列を取得し、他のデータ型に変換します。

BAG_FUNCTION

プリミティブ・データ型のバッグ(順序付けられていない値の集合体。値が重複する場合もあります)を処理し、たとえばバッグ内のデータ型や、バッグ内の値の数を判定します。

SET_FUNCTION

(重複する要素の削除により)2つのバッグの模倣セットを処理します。

HIGHER_ORDER_BAG_FUNCTION

通常時に関数をバッグに適用できるようにバッグを処理します。

SPECIAL_MATCH_FUNCTION

様々なデータ型を処理し、指定された標準の一致アルゴリズムに基づいてブールで評価します。

CUSTOM_FUNCTION

これらの関数は、次の用途に使用できます。

- ポリシー・ルールの制約

- 義務内での値の戻し

- カスタム/組込み関数の入力パラメータ

データ型とそれらの使用方法の詳細は、XACML 2.0仕様を参照してください(http://docs.oasis-open.org/xacml/)。

2.3 単純なポリシーの実行

1.2項「単純なポリシーの構成」で説明した単純なポリシーの手順を実行するには、特定の順序でオブジェクトを作成する必要があります。たとえば、ResourceEntryオブジェクトは、ResourceTypeオブジェクトを定義した後にのみ作成できます。次のセクションは、単純なポリシーをプログラムで実行する場合の適切な順序で並べられています。

- 2.3.1項「ポリシー・ストアへのアクセス」

- 2.3.2項「アプリケーション・ポリシーの作成」

- 2.3.3項「リソース・タイプの定義」

- 2.3.4項「リソースのインスタンス化」

- 2.3.5項「リソースへのアクションの関連付け」

- 2.3.6項「ポリシー・ルールの指定」

- 2.3.7項「プリンシパルの指定」

- 2.3.8項「ポリシーの定義」

注意:

ポリシー・オブジェクトを作成する前に、ポリシー・モデル・コンポーネントの全体的な編成構造を決定する必要があります。たとえば、1つのApplicationPolicyオブジェクトのみを実装し、その親の内部の複数のPolicyDomainEntryオブジェクトにポリシーを委任すると便利な場合があります。詳細は、5.7項「ポリシー・ドメインの委任」を参照してください。

2.3.1 ポリシー・ストアへのアクセス

あらゆるポリシー管理アクティビティより前に、PolicyStoreオブジェクトのインスタンスを取得する必要があります。次の手順は、oracle.security.jpsパッケージのインタフェースを使用して、PolicyStoreオブジェクトを取得する方法を示しています。Smithは、ポリシーを管理する管理権限を持ったユーザーとして指定されています。

注意:

コールが認可されていないユーザーのメソッドには、エラーが返されます。

1. PolicyStoreのインスタンスを取得します。

JpsContextFactory ctxFact = JpsContextFactory.getContextFactory();
JpsContext ctx = ctxFact.getContext();
PolicyStore ps = ctx.getServiceInstance(PolicyStore.class);
if (ps == null) {
// if no policy store instance configured in jps-config.xml
System.out.println(“no policy store instance configured”);
return;
}

JpsContextは、Oracle Platform Security Servicesを構成するファイルjps-config.xml内の特定のドメインで共通のサービス・インスタンスのコレクションを宣言します。複数のJpsContextがjps-config.xmlで定義されている場合は、デフォルトのJpsContextで指定されているポリシー・ストアが返されます。また、特定のJpsContextを名前で取得することもできます。

この構成ファイルの詳細は、『Oracle Fusion Middlewareセキュリティ・ガイド』を参照してください。Oracle Entitlements Server固有のパラメータは、『Oracle Fusion Middleware Oracle Entitlements Server管理者ガイド』を参照してください。

注意:

- ポリシー・ストア・インスタンスを構成していない場合、getServiceInstance()によってNULLが返されます。

- 接続を確立していない場合、getServiceInstance()によってjavax.persistence.PersistenceExceptionがスローされます。

- PolicyStoreオブジェクトが取得済で、接続が切断された場合は、ポリシー・ストア内のすべての処理にPolicyStoreExceptionが実行されます。バックエンドが停止した場合は、1回の再開操作でバックアップが使用可能になります。バックエンド・ストアの高可用性も可能です。

2. 管理ユーザーを指定します。

Subject smith = new Subject();
Principal principal = new WLSUserImpl("smith");
smith.getPrincipals().add(principal);
BindingPolicyStore ps = BindingPolicyStoreFactory.getInstance();ps.setSubject(smith);

このコードは、アプリケーション・コンテナの認証メカニズムを使用してサブジェクトが設定されていない場合にのみ必要になります。認証メカニズムによってサブジェクトを設定している場合は、取得された認証済のサブジェクトはポリシー・ストアへのアクセスを認証されます。BindingPolicyStoreを使用する必要はありません。

2.3.2 アプリケーション・ポリシーの作成

ApplicationPolicyオブジェクトは、特定のアプリケーションへの保護されたアクセスを定義するために必要なすべてのオブジェクトのコンテナです。ApplicationPolicyオブジェクトは、保護対象のターゲットごとに作成する必要があります。必要な数だけ作成できます。ApplicationPolicyを作成すると、このオブジェクトは、プログラム・マネージャを含んだApplicationPolicyインタフェースによって表現されます。プログラム・マネージャは、アプリケーションのアクセス要件を定義するために使用するリソース、ポリシーおよびその他のセキュリティ・オブジェクトを作成するために必要です。これらのセキュリティ・オブジェクトは、第1章「ポリシー・モデルの使用方法」で定義されたモデルで構成されます。

注意:

ApplicationPolicyオブジェクトは、Oracle Entitlements Server管理コンソールでアプリケーションとして表現されます。

ApplicationPolicyオブジェクトは、PolicyStoreインタフェースにあるメソッドによって作成、削除および取得できます。例2-1に、createApplicationPolicy()メソッドを使用してApplicationPolicyオブジェクトを作成する方法を示します。

例2-1 createApplicationPolicy()メソッドの使用方法

ApplicationPolicy ap = ps.createApplicationPolicy("Trading", "Trading
Application","Trading Application.");

createApplicationPolicy()パラメータの値は次のように定義されています。

- 名前 - TradingはApplicationPolicyオブジェクトの固有の識別子です。

- 表示名 - Trading ApplicationはApplicationPolicyオブジェクトのオプションの判読可能名です。

- 説明 - Trading Application.は、ApplicationPolicyオブジェクトについて説明するオプションの情報です。

注意:

ApplicationPolicyオブジェクトを削除すると、その中に作成されたすべての子オブジェクトも削除されます。

2.3.3 リソース・タイプの定義

ResourceTypeEntryオブジェクトは、特定の種類のリソースの特性の範囲全体を指定します。(ApplicationPolicyオブジェクトに関連付けられた)高いレベルのResourceTypeEntryオブジェクトから、特定のResourceオブジェクトをインスタンス化して、実際の保護されたターゲットを表現します。したがって、ResourceTypeEntryは、リソース属性(このリソース・タイプのインスタンスが持つことができる仕様)と、保護されたインスタンスで実行できるすべての有効なアクションの定義を含みます。ResourceTypeEntryに追加されたアクションは標準のアクション(URLへのGETおよびPOST)の場合も、ビジネス・オブジェクトでのカスタム・アクション(銀行口座間の振替)の場合もあります。

注意:

ResourceTypeEntryオブジェクトは、Oracle Entitlements Server管理コンソールでリソース・タイプとして表現されます。

ResourceTypeEntryを作成、削除、取得または変更するには、ResourceTypeManagerのインスタンスを取得します。例2-2では、TradingAppというApplicationPolicyオブジェクトにTradingResTypeという名前のResourceTypeEntryを作成しています。TradingResTypeには、2つの有効なアクション(BUYおよびSELL)とManagerTypeという名前の属性があります。

例2-2 createResourceType()メソッドの使用方法

ResourceTypeManager resourceTypeManager = tradingApp.getResourceTypeManager();
List<String> actions = new ArrayList();
actions.add("get");
List<AttributeEntry<? extends DataType>> attributes = new
ArrayList<AttributeEntry<? extends DataType>>();attributes.add(new BasicAttributeEntry<OpssString>
("orderNo", OpssString.class));attributes.add(new BasicAttributeEntry<OpssBoolean>
("isDomestic", OpssBoolean.class));
ResourceTypeEntry resType = rtm.createResourceType
("TradingResType", "Trading ResType", "Trading Resource Type",
actions, attributes, ",", null);

tradingAppは、ResourceTypeManagerの取得元のApplicationPolicyオブジェクトの名前です。createResourceType()パラメータの値は次のように定義されています。

- 名前 - TradingResTypeはResourceTypeEntryの固有の識別子です。

- 表示名 - Trading ResTypeはResourceTypeEntryのオプションの判読可能名です。

- 説明 - Trading Resource TypeはResourceTypeEntryを説明するオプションの情報です。

- アクション - actionsは、 ResourceTypeEntryのすべての有効なアクションの順序付けされたコレクション(リスト)です。この場合はGETです。setAllAction()メソッドを使用して、デフォルトのアクション・キーワードを設定します。

- 属性 - attributesはResourceTypeEntryのすべての有効な属性のリストを指定します。重複している属性がある場合は、1つのものとして処理されます。1つまたは複数の属性を定義するには、ExtensionManagerのcreateAttribute()によって作成し、ここで参照します。詳細は、2.4.3項「属性と関数定義の作成」を参照してください。属性もNULLを指定できます。

- デリミタ - / (フォワード・スラッシュ)は、アクションのデフォルトのデリミタです。別のデリミタを設定するにはsetResourceNameDelimiter()メソッドを使用します。このメソッドにデリミタをResourceTypeEntry.ResourceNameDelimiter列挙として渡します。

- リソース・マッチャー・クラス - NULLは、ターゲットおよびアクション・マッチングに使用するリソース権限マッチャー・クラスがないことを表します。Java権限クラスの実装を設定するには、マッチャー・クラスのクラス名を割り当てます。この場合、リソース・タイプは所定の権限にバインドされます。リソース・タイプによって定義されたポリシーは、権限ベースのポリシーです。

ResourceTypeEntryオブジェクトは、オブジェクトのsetHierarchicalResource()メソッドを呼び出すことで階層として定義することもできます。isHierarchicalパラメータにtrueを渡すことにより、ResourceTypeEntryが階層として設定されます。これにより階層型のResourceTypeEntryを使用して、次の適用を受けるResourceEntryをインスタンス化できます。

1. 階層型のResourceTypeEntryから作成されたResourceEntryに適用可能なポリシーは、子のResourceEntryオブジェクトにも適用可能です。

2. 階層型のResourceTypeEntryから作成されたResourceEntryに定義された属性は、子のResourceEntryオブジェクトにも継承されます。

isHierarchicalResource()メソッドは、ResourceTypeEntryが階層として設定されているかどうかを判定するために使用できます。

ResourceTypeEntryオブジェクトのResourceEntryインスタンスの作成は、2.3.4項「リソースのインスタンス化」を参照してください。

2.3.4 リソースのインスタンス化

ResourceEntryオブジェクトは、保護アプリケーション内で特定の保護されたターゲットを表します。コンテナ(URL、EJB、JSP)により管理されるソフトウェア・コンポーネント、またはアプリケーション内のビジネス・オブジェクト(レポート、取引、収益のグラフ)を表すことができます。

注意:

ソフトウェア・コンポーネントとビジネス・オブジェクトの詳細は、『Oracle Fusion Middleware Oracle Entitlements Server管理者ガイド』を参照してください。

ResourceEntryオブジェクトは、ResourceTypeEntryオブジェクトのインスタンスとして定義されます。該当するResourceTypeEntryは、ResourceEntryのインスタンスの作成を試行する前に定義してください。詳細は、2.3.3項「リソース・タイプの定義」を参照してください。

ResourceEntryオブジェクトを作成するには、該当するApplicationPolicyまたはPolicyDomainEntryの getResourceManager()メソッドを使用してResourceManagerのインスタンスを取得します。次に、createResource()メソッドを使用してオブジェクトを作成します。

注意:

ResourceEntryオブジェクトは、Oracle Entitlements Server管理コンソールでリソースとして表現されます。

例2-3では、当座預金口座のResourceEntryを作成しています。Tradingは、ResourceManagerを取得するApplicationPolicyオブジェクトを表します。

例2-3 createResource()メソッドの使用方法

ResourceManager resMgr = Trading.getResourceManager();
List<AttributeEntry<? extends DataType>> attributes = new
ArrayList<AttributeEntry<? extends DataType>>();
attributes.add(new BasicAttributeEntry<OpssString>
("orderNo", new OpssString("12345678")));
attributes.add(new BasicAttributeEntry<OpssBoolean>
("isDomestic", new OpssBoolean(true)));
ResourceEntry checkingRes = resMgr.createResource("Bob_checking1",
"Bob Checking Account", "Checking account.", resType, attributes);

createResource()パラメータの値は次のように定義されています。

- 名前 - Bob_checking1はResourceEntryの固有の識別子です。

- 表示名 - Bob Checking AccountはResourceEntryのオプションの判読可能名です。

- 説明 - Checking account.はResourceEntryを説明するオプションの情報です。

- タイプ - resTypeは、リソースをインスタンス化するResourceTypeEntryオブジェクトです。

- 属性 - このResourceEntryに対して構成している(オプションの)リソース属性が存在することを指定します。この場合は、順序番号と、リソースが内部にあるかどうかに関するブール値です。1つまたは複数の属性を定義するには、ExtensionManagerのcreateAttribute()によって作成し、ここで参照します。

ResourceEntryを作成したら、ResourceActionsEntry内でアクションとペアにするか、PermissionSetEntry内に含めることができます。詳細は、2.3.5項「リソースへのアクションの関連付け」および2.4.4項「プロパティ・セットの定義」を参照してください。

注意:

2.3.3項「リソース・タイプの定義」の説明のとおり、階層型ResourceEntryオブジェクトは、ResourceTypeEntryオブジェクトからインスタンス化できます。階層型ResourceEntryオブジェクトをインスタンス化する場合には、次の条件を満足する必要があります。

- ResourceEntryの名前は、デリミタで始まる必要があります。たとえば、デリミタが/の場合、有効な名前は/region/Eastです。

- すべての親のResourceEntryオブジェクトは作成済である必要があります。たとえば、リソース/region/East/NYを作成できるのは、/regionと/region/Eastの両方が作成済の場合のみです。

2.3.5 リソースへのアクションの関連付け

ResourceActionsEntryオブジェクトは、リソース・インスタンスを、そのインスタンスに対して実行できる一連のアクションと関連付けます。リソース・インスタンスは、静的なResourceEntryまたは動的なResourceNameExpressionのいずれかに指定します。

注意:

ResourceActionsEntryは、独立して管理可能な名前付きオブジェクトではありません。単純な関係です。

詳細は、次の各項を参照してください。

- 2.3.5.1項「ResourceEntryの使用方法」

- 2.3.5.2項「ResourceNameExpressionの使用方法」

2.3.5.1 ResourceEntryの使用方法

ResourceEntryをインスタンス化する手順は、2.3.4項「リソースのインスタンス化」を参照してください。ResourceEntryをインスタンス化したら、ResourceActionsEntryオブジェクトを作成して、そのリソースに対して実行可能なアクションを定義します。一連のアクションは、対応するResourceTypeEntryに対して定義されている有効なアクションのサブセットを使用して、リストに定義します。例2-4では、ResourceActionsEntryインタフェースを使用してResourceEntryとアクションの間に関係(resActsList)を作成しています。この例では、当座預金口座ResourceEntryを作成し、その当座預金口座に読取りと変更の機能を関連付けています。

例2-4 ResourceEntryによるResourceActionsEntryの作成

ResourceEntry checkingRes = resMgr.createResource("Bob_checking1",
"Bob Checking Account", "Checking account.",resType, null);
List<String> actions = new ArrayList<String>();
actions.add(“read”);
actions.add(“write”);
List<ResourceActionsEntry> resActsList = new
ArrayList<ResourceActionsEntry>();
resActsList.add(new BasicResourceActionsEntry(checkingRes, actions));

Bob_checking1は、ResourceEntryです。Listは、Bob_checking1に対して適用可能なアクションを定義しています。それらは、読取りおよび書込みであり、このResourceActionsEntryオブジェクトで管理されます。許容されるアクションは、親のResourceTypeEntryから抽出されます。

2.3.5.2 ResourceNameExpressionの使用方法

ResourceEntryを使用するかわりに、ResourceNameExpressionを指定することもできます。ResourceNameExpressionは、定義済のResourceTypeEntryと文字列を表現するJava正規表現を含みます。文字列は、実行時にResourceEntryインスタンスと一致させるために使用されます。たとえば、表2-4のポリシー・データが定義済であるとします。RAE1およびRAE2が、専用のResourceEntryオブジェクトのResType1およびResType2によって定義されています。RAE3はResourceNameExpressionによって定義されます。Policy3の実行時の評価で、ResourceEntryとの一致にhttp://*が使用され、HTTP URLに対応するResourceEntryのResType1が返されます。

表2-4 ResourceNameExpressionオブジェクトの照合

ResourceEntry

ResourceActionsEntry

ポリシー

ResType1(HTTP URL)

RAE1とResType1 ResourceEntry http://www.oracle.com、およびアクションGET

Policy1とRAE1

ResType2 (HTTPS URL)

RAE2とResType2 ResourceEntry https://www.oracle.com、およびアクションGET

Policy2とRAE2

RAE3とResType1 ResourceNameExpression http://*、およびアクションGET

Policy3とRAE3

例2-5は、ResourceNameExpressionによってResourceActionsEntryを作成する方法を示しています。

例2-5 ResourceNameExpressionによるResourceActionsEntryの作成

// create one ResourceActionEntry
ResourceNameExpression resExpression = new ResourceNameExpression
(resTypeName, resNameExp);
ResourceActionsEntry resActionsEntry = new BasicResourceActionsEntry
(resExpression, actions);

List<ResourceActionsEntry> resActionsList =
new ArrayList<ResourceActionsEntry>();
resActionsList.add(resActionsEntry);

表2-5はResourceNameExpressionの例を示しています。任意の正規表現を使用できますが、表に記載されているパターン表現は、正規表現よりも高速に処理されます。

表2-5 ResourceNameExpressionの例

式

説明

リソース・タイプ固有

アクション・タイプを指定するには、リソース・タイプ専用のキーワードを使用します。

resActsList.add(new BasicResourceActionsEntry(checkingRes,"any"));

".*"

すべてのリソースを指定します。

resActsList.add(new BasicResourceActionsEntry(".*", actions));

"http.*"

先頭がhttpのすべてのリソースを指定します。

resActsList.add(new BasicResourceActionsEntry("http.*", actions));

".*html"

末尾がhtmlのすべてのリソースを指定します。

ResourceActionsEntry suffixResActions = new BasicResourceActionsEntry(".*html", actions);

1つ以上のResourceActionsEntryオブジェクトに権限セットを移入することもできます。詳細は、2.4.4「権限セットの定義」を参照してください。

2.3.6 ポリシー・ルールの指定

PolicyRuleEntryは、結果(およびオプションで条件)を定義します。結果には、ポリシー・ルールから実現可能な結果を指定します。Oracle Entitlements Serverでの結果はGRANTまたはDENYです。ポリシー・ルールが(プリンシパルとターゲットのResourceEntryに関する情報とともに)評価されるとき、ResourceEntryに対するサブジェクトの権限が決定されます。すべてのPolicyEntryオブジェクトは、ポリシー・ルールを1つ(のみ)含む必要があります。詳細は、2.3.8項「ポリシーの定義」を参照してください。

例2-6に、BasicPolicyRuleEntry実装を使用してmyRuleという名前のPolicyRuleEntryオブジェクトを作成する方法を示します。

例2-6 PolicyRuleEntryの作成

PolicyRuleEntry myRule = new BasicPolicyRuleEntry
("ReportRule", "Report Policy Rule", "Rule for Reports policy.",
PolicyRuleEntry.EffectType.GRANT, myCondition);

パラメータの値は次のように定義されています。

- 名前 - ReportRuleはポリシー・ルールの固有の識別子です。

- 表示名 - Report Policy Ruleはポリシー・ルールのオプションの判読可能名です。

- 説明 - Rule for Reports policyはポリシー・ルールを説明するオプションの情報です。

- PolicyRuleEntry.EffectType - 目的とする結果に基づいてGRANTの値を取得します。PolicyRuleEntry.EffectType列挙は、Oracle Entitlements Serverの使用可能な結果タイプを定義します。この定数は、GRANTまたはDENYです。

- 条件 - myConditionは、ポリシー・ルールによって使用されるオプションの条件の名前です。条件は、BooleanExpressionEntryであり、ブール値を返すExpressionを表します。詳細は、2.4.5項「条件の定義」を参照してください。

2.3.7 プリンシパルの指定

PrincipalEntryは、ポリシーに関連するユーザー、グループまたはロールを指定します。これは、2.3.8項「ポリシーの定義」の説明のとおり、PolicyEntryオブジェクトに追加します。表2-6は、プリンシパルの種類と、プログラムによってそれらを指定する方法を示しています。

表2-6 プログラムによるプリンシパルの指定

プリンシパルのタイプ

例

ユーザー

ユーザー・プリンシパル検証プロバイダのクラス名(weblogic.security.principal.WLSUserImpl)とユーザー名を指定します。次の例では、smithという名前のユーザーを指定しています。

PrincipalEntry aUser = new BasicPrincipalEntry
("weblogic.security.principal.WLSUserImpl", "smith");
List<PrincipalEntry> myPrincipal = new
ArrayList<PrincipalEntry>(); myPrincipal.add(aUser);

グループ

グループ・プリンシパル検証プロバイダ(weblogic.security.principal.WLSGroupImpl)のクラス名とグループ名を指定します。次の例は、Acmeという名前のグループを定義しています。

PrincipalEntry aGroup = new BasicPrincipalEntry
("weblogic.security.principal.WLSGroupImpl", "Acme");
List<PrincipalEntry> myPrincipal = new
ArrayList<PrincipalEntry>(); myPrincipal.add(aGroup);

ロール

tRoleアプリケーション・ロールを取得し、PrincipalEntryに追加します。

AppRoleEntry aRole =
appRoleManager.getAppRole(tRole);
List<PrincipalEntry> principal =
new ArrayList<PrincipalEntry>();
principals.add(tRole);

詳細は、2.4.1項「アプリケーション・ロールの作成」を参照してください。

匿名ロール

ポリシーにanonymousをプリンシパルとして追加します。これにより、匿名ユーザーへのアクセスが可能になります。

PrincipalEntry anonymous = new AnonymousRoleEntry();
List<PrincipalEntry> principals = new
ArrayList<PrincipalEntry>();
principals.add(anonymous);

詳細は、2.4.1項「アプリケーション・ロールの作成」を参照してください。

認証ロール

ポリシーにauthenticatedをプリンシパルとして追加します。これにより、認証済ユーザーへのアクセスが可能になります。

PrincipalEntry authenticated = new AuthenticatedRoleEntry();
List<PrincipalEntry> principals = new
ArrayList<PrincipalEntry>();
principals.add(authenticated);

詳細は、2.4.1項「アプリケーション・ロールの作成」を参照してください。

ポリシーのサブジェクトが複数のグループ、ロールまたはそれら両方の場合、定義済のプリンシパル・セマンティックに基づいてユーザーにポリシーが適用されます。次のオプションがあります。

- PRINCIPAL_AND_SEMANTICは、プリンシパルとしてリストされているALLグループまたはロールにユーザーが一致する場合に、そのユーザーに適用されるポリシーを定義します。たとえば、プリンシパルのリストに2つのロールが含まれている場合、ポリシーを適用するには、ユーザーをポリシーの両方のロールのメンバーにする必要があります。

- PRINCIPAL_OR_SEMANTICは、プリンシパルとしてリストされているグループまたはロールの1つのAT LEASTにユーザーが一致する場合に、そのユーザーに適用されるポリシーを定義します。たとえば、プリンシパルのリストに2つのロールが含まれている場合、ユーザーは、適用されるポリシーのこれらのロールの1つのみでメンバーになることができます。

2.3.8 ポリシーの定義

ポリシーは、特定のプリンシパルが特定のリソースに対して所有するアクセス権を指定します。基本的に、PolicyRuleEntry、ResourceActionsEntry、PrincipalEntryなど、アクセス制御に必要なすべての要素が統合されています。

ポリシーは、プログラミングではPolicyEntryオブジェクトとして表現されます。PolicyEntryオブジェクトを作成するには、getPolicyManager()メソッドを使用して、PolicyManagerのインスタンスを取得します。次に、createPolicy()メソッドを使用してオブジェクトを作成します。例2-7は、myPolicyという名前のポリシーを作成しています。

例2-7 createPolicy()の例の使用方法

PolicyManager policyMgr = domain.getPolicyManager();

List<PermissionSetEntry> permSets = new ArrayList<PermissionSetEntry>();
permSets.add(permSet1);
permSets.add(permSet2);

List<PrincipalEntry> principals = new ArrayList<PrincipalEntry>();
principals.add(appRole1);
principals.add(new BasicPrincipalEntry(WLSUserImpl.class.getCanonicalName(), "john"));

PolicyEntry myPolicy = policyManager.createPolicy
("BankPolicy", "Bank policy", "Policy for bank.", myRule,
permSets, principals, null, obligations, PolicyEntry.POLICY_SEMANTIC.AND);

domainは、ポリシーを作成するポリシー・ドメインを参照します。>createPolicy()パラメータの値は次のように定義されています。

- 名前 - Bank PolicyはPolicyEntryの固有の識別子です。

- 表示名 - Bank policyはPolicyEntryのオプションの判読可能名です。

- 説明 - Policy for bank.はPolicyEntryを説明するオプションの情報です。

- ポリシー・ルール - myruleはPolicyRuleEntryオブジェクトです。

- PermissionSetEntry - permSetsはPermissionSetEntryオブジェクトのコレクション(リスト)です。詳細は、2.4.4「権限セットの定義」を参照してください。

- プリンシパル - principalsは、このポリシーのサブジェクトとして定義されたPrincipalEntryオブジェクトの順序付きのコレクション(リスト)です。

- ResourceActionsEntry - ResourceActionsEntryオブジェクトのリストも定義可能です。PermissionSetEntryオブジェクトのリストがNULLの場合、このリストに有効な要素が少なくとも1つ含まれている必要があります。

- 義務 - ObligationEntryオブジェクトのリストを使用可能です。詳細は、2.4.6「義務の追加」を参照してください。

- policySemantic - ポリシーで指定されたプリンシパルの処理方法を指定します。PolicyEntry.POLICY_SEMANTIC列挙は、ANDまたはORの使用可能定数を定義します。

- PolicyEntry.POLICY_SEMANTIC.ANDは、ユーザーがポリシーにリストされているすべてのプリンシパルに一致する場合に、そのユーザーに適用されます。たとえば、プリンシパルのリストに2つのロールがある場合、そのユーザーは適用されるポリシーの両方のロールのメンバーである必要があります。

- PolicyEntry.POLICY_SEMANTIC.ORは、ユーザーがポリシーにリストされている少なくとも1つのプリンシパルに一致する場合に、そのユーザーに適用されます。たとえば、プリンシパルのリストに2つのロールが含まれているとき、ポリシーを適用するにはユーザーをこれらのロールの少なくとも1つのメンバーにします。

2.4 単純なポリシー用の詳細な要素の作成

2.3項「単純なポリシーの実行」では、ポリシーを定義するために最小限必要なコンポーネントの作成方法について説明しました。次の項では、単純なポリシーに1.3項「単純なポリシーへの詳細なオブジェクトの追加」で説明した拡張ポリシー要素の追加方法について説明します。

- 2.4.1項「アプリケーション・ロールの作成」

- 2.4.2項「ロール・マッピング・ポリシーの作成」

- 2.4.3項「属性と関数定義の作成」

- 2.4.4項「権限セットの定義」

- 2.4.5項「条件の定義」

- 2.4.6項「義務の追加」

2.4.1 アプリケーション・ロールの作成

AppRoleEntryオブジェクトは、アクセス権をグループ化するためにApplicationPolicyに関連付けます。これにより、アプリケーション・ロールを付与するユーザーに配布できます。AppRoleEntryを定義すれば、grantAppRoleを使用して静的にロールをプリンシパルに割り当てたり、ロール・マッピング・ポリシーを使用して動的にプリンシパルに割り当てることができます。(詳細は、2.4.2項「ロール・マッピング・ポリシーの作成」を参照してください。)AppRoleEntryには次の要素をメンバーとして追加できます。

- アイデンティティ・ストアのエンタープライズ・ユーザー

- アイデンティティ・ストアのエンタープライズ・ロール

- ポリシー・ストアのその他のアプリケーション・ロール

注意:

AppRoleEntryオブジェクトは、Oracle Entitlements Server管理コンソールでアプリケーション・ロールとして表現されます。アプリケーション・ロールは、管理コンソールのナビゲーション・ツリーの「ロール・カタログ」ブランチの配下にまとめられます。

アプリケーション・ロールが特定のポリシーのプリンシパルとして指定されている場合、ロールに割り当てられているすべてのユーザーがそのポリシーによって管理されます。すべてのApplicationPolicyコンテナには、2つの暗黙的なアプリケーション・ロールがあります。

- 匿名ロール — 認可されていないすべてのユーザーに暗黙的に割り当てられます。

- 認可ロール — 認可されているすべてのユーザーに暗黙的に割り当てられます。

AppRoleEntryを作成するには、アプリケーション・ロールを作成するApplicationPolicyオブジェクト内からAppRoleManagerインスタンスを取得し、createAppRole()メソッドを使用します。例2-8は、TraderRoleという名前のAppRoleEntryの作成を示しています。

例2-8 アプリケーション・ロールの作成

AppRoleManager roleMgr = bankApplication.getAppRoleManager();
AppRoleEntry traderRole = roleMgr.createAppRole("TraderRole",
"Trader Role", "Trader role");

bankApplicationは、AppRoleManagerを取得するApplicationPolicyオブジェクトを定義しています。createAppRole()パラメータの値は次のように定義されています。

- 名前 - TraderRoleはAppRoleEntryオブジェクトの固有の識別子です。

- 表示名 - Trader RoleはAppRoleEntryオブジェクトのオプションの判読可能名です。

- 説明 - Trader Roleは、AppRoleEntryオブジェクトについて説明するオプションの情報です。

AppRoleEntryオブジェクトにプリンシパルを割り当てるには、適切なユーザーまたはグループを含んだPrincipalEntryリストを作成します。grantAppRole()は、ロールをリストのプリンシパルに割り当てるために使用します。例2-9は、ユーザーJSMITHの作成と、TraderRoleへの割当てを示しています。

例2-9 アプリケーション・ロールへのプリンシパルの割当て

//create user named JSMITH PrincipalEntry aUser = new
BasicPrincipalEntry("weblogic.security.principal.WLSUserImpl", "JSMITH");

//Add user to principals list
List<PrincipalEntry> principalList = new ArrayList<PrincipalEntry>();
principal.add(aUser);

//assign user to role.
roleMgr.grantAppRole(traderRole, principal);

grantAppRole()パラメータの値は次のように定義されています。

- 名前 - TraderRoleは、ユーザーの割当て先のAppRoleEntryオブジェクトの名前です。

- プリンシパル - principalは追加するユーザーを含んだリストの名前です。

アプリケーション・ロール階層は、他のアプリケーション・ロールのメンバーにアプリケーション・ロールを割り当てることで作成できます。アプリケーション・ロールに適用されるポリシーは、そのメンバーとして割り当てられたすべてのアプリケーション・ロールにも適用されます。例2-10では、TraderManagersロールがAllManagersロールのメンバーとして割り当てられています。したがって、AllManagersロールのメンバーに適用されるすべてのポリシーは、TraderManagersロールのすべてのメンバーにも適用されます。

例2-10 アプリケーション・ロール階層の適用

//create AllManagers and TraderManagers roles
AppRoleEntry allManagers = roleMgr.createAppRole("AllManagers",
"AllManagers Role","Role for all managers.");
AppRoleEntry traderManagers = roleMgr.createAppRole(“TraderManagers",
"TraderManagers Role", "Role for Trader managers.");

//add TraderManagers to a principals list
List<PrincipalEntry> principalList = new ArrayList<PrincipalEntry>();
principal.add(traderManagers);

//add TraderManagers role as principal of AllManagers role
roleMgr.grantAppRole(allManagers, principal);

2.4.2 ロール・マッピング・ポリシーの作成

ロール・マッピング・ポリシーはApplicationPolicyレベルで作成されます。これは、アプリケーション・ロールが定義されるレベルと同じレベルです。RolePolicyEntryオブジェクトはロール・マッピング・ポリシーを表します。このオブジェクトは、ポリシーを定義するメソッドを提供します。そのメソッドによって、ユーザーまたはグループにアプリケーション・ロールを付与するか、または拒否するかどうかが決定されます。

注意:

RolePolicyEntryオブジェクトは、Oracle Entitlements Server管理コンソールでロール・マッピング・ポリシーとして表現され、ロール・カタログ内で編成されます。

RolePolicyEntryオブジェクトを作成するには、対応するApplicationPolicy内のgetRolePolicyManager()メソッドを使用して、RolePolicyManagerのインスタンスを取得します。次に、createRolePolicy()メソッドを使用してオブジェクトを作成します。

例2-11 createRolePolicyメソッドの使用方法

//get the RolePolicyManager
RolePolicyManager roleMapPolicyManager = TellerApp.getRolePolicyManager();

List<AppRoleEntry> appRoles = new ArrayList<AppRoleEntry>();
appRoles.add(appRole1);

List<PrincipalEntry> principalList = new ArrayList<PrincipalEntry>();
principals.add(new BasicPrincipalEntry(WLSUserImpl.class.getCanonicalName(), "john"));

PolicyRuleEntry rule = new BasicRuleEntry("rule", "rule for role policy", "rule for role policy", EffectType.GRANT, null);

List<ResourceEntry> resources = new ArrayList<ResourceEntry>();
resources.add(resource1);

//create the RolePolicyEntry
RolePolicyEntry rolepolicy = roleMapPolicyManager.createRolePolicy
("TellerRoleMapping", "Teller Role Mapping", "Teller Role Mapping Policy",
appRoles, principals, rule, resources, null);

TellerAppは、RolePolicyManagerの取得元のApplicationPolicyオブジェクトの名前です。createRolePolicyEntry()パラメータの値は次のように定義されています。

- 名前 - TellerRoleMappingはRolePolicyEntryの固有の識別子です。

- 表示名 - Teller Role MappingはRolePolicyEntryのオプションの判読可能名です。

- 説明 - Teller Role Mapping PolicyはResourceTypeEntryを説明するオプションの情報です。

- アプリケーション・ロール・リスト - appRolesは、RolePolicyEntryの評価で付与(または拒否)されるすべてのアプリケーション・ロールの順序付きコレクション(リスト)です。

- プリンシパル・リスト - principalsはアプリケーション・ロールにマップするPrincipalEntryオブジェクトのコレクション(リスト)です。この値は、ApplicationRoleまたは管理ロールとなります。また、このリストを空にすることはできません。

注意:

ロール・マッピング・ポリシーはORセマンティックのみを使用します。詳細は、2.3.7項「プリンシパルの指定」を参照してください。

- ポリシー・ルール - ruleは、ロール・マッピング・ポリシーの条件を定義するPolicyRuleEntryオブジェクトです。特定の値が必要です。

注意:

ロール・マッピング・ポリシーの条件は、認可ポリシーの条件と同じ機能を提供します。

- リソース名 - resourcesは、ロール・マッピング・ポリシーに関連付けるResourceEntryオブジェクトのリストです。これは、NULLまたは空のリストを指定できるオプションのパラメータです。このパラメータでは、ロール・マッピング・ポリシーの範囲を特定の(複数の)リソースに指定することもできます。

- リソース名の式 - この値には、リソース名の式を指定して、ロール・マッピング・ポリシーに関連付けることができます。これは、(この例のように)NULLまたは空のリストを指定できるオプションのパラメータです。このパラメータでは、ロール・マッピング・ポリシーの範囲を特定の(複数の)リソースに指定することもできます。

2.4.3 属性と関数定義の作成

属性または関数定義は、特定の属性または関数を記述するメタデータです。いくつかの情報の中で、属性や関数の名前、属性が取得するデータの型または関数の戻り値を値として定義し、さらに該当する値が単一か複数であるかを定義します。メタデータは、Oracle Entitlements Serverに、定義された特定の属性または関数の処理方法を指定します。属性および関数の定義は条件や義務で使用することができます。条件については、属性および関数の定義を使用して、保護リソースへのアクセスをさらに制限するためにポリシーに追加できるオプションの式を作成できます。義務については、このオプションの名前と値のペアから、ポリシー決定によって、ポリシー実行ポイント(PEP)に追加情報が返されます。義務を定義するには次の2つの方法があります。

- 絶対値を含む属性が返される場合に、静的に定義。

- 属性値またはカスタム関数が実行時に評価され出力が返される場合に、動的に定義。

注意:

概要は、1.3.3項「条件の追加」および1.3.5項「義務の作成」を参照してください。2.4.5項「条件の定義」および2.4.6「義務の追加」には、コーディングに関する追加情報があります。

属性および関数定義は、ApplicationPolicyレベルで管理されます。定義は、Oracle Entitlements Server用に事前定義されたものを使用するか、ExtensionManagerを使用して要求に合せて新しいものを定義できます。カスタム定義の作成に関する情報は、次の項を参照してください。

- 2.4.3.1項「属性定義の作成」

- 2.4.3.2項「カスタム関数定義の作成」

事前定義されたRuleExpressionEntry.BuiltInAttributesおよびRuleExpressionEntry.BuiltInFunctions列挙定義の情報は、Oracle Fusion Middleware Oracle Entitlements Server管理Java APIリファレンスを参照してください。

2.4.3.1 属性定義の作成

AttributeEntryオブジェクトは、実行時に動的に定義される値(たとえばユーザーの地域)や、保護リソースのタイプに基づく値(たとえばテキスト・ファイルの作成日)の場合があります。ポリシーの評価中に、属性値はアプリケーションにより渡されることができるか、またはOracle Entitlements Serverが属性リトリーバ・コンポーネントを使用して取得できます。

注意:

動的な属性定義は、ApplicationPolicyの子オブジェクトとして管理することで、別のポリシー・ドメイン内のポリシーで使用できます。ポリシー・ドメインの詳細は、第5章「ポリシー管理の委任」を参照してください。

属性定義を作成するには、ExtensionManagerのインスタンスを取得し、createAttribute()メソッドを使用します。例2-12では、myAttrという名前の属性定義を作成しています。

例2-12 動的な属性定義の作成

//get the ExtensionManager
ExtensionManager xMgr = bankApplication.getExtensionManager();

//create the dynamic attribute
AttributeEntry<OpssString> attr = xMgr.createAttribute
("min_age", "minimum age", "minimum age of subject.", OpssString.class,
AttributeEntry.AttributeCategory.DYNAMIC, true);

bankApplicationは、拡張を作成するApplicationPolicyオブジェクトを表します。createAttribute()パラメータの値は次のように定義されています。

- 名前 - min_ageは属性の固有の識別子です。

- 表示名 - minimum ageは属性のオプションの判読可能名です。

- 説明 - minimum age of subject.は属性を説明するオプションの情報です。

- データ型 - OpssString.classは、属性のデータ型です。この場合は文字列です。このパラメータは、oracle.security.jps.service.policystore.info.DataTypeクラスの任意のサブクラスの値を取得します。

注意:

attr.setValue(new OpssString("John"))は、文字列の値をJohnに設定するコードです。

- カテゴリ - AttributeEntry.AttributeCategory.DYNAMICは属性を動的に定義します。これには、DYNAMICまたはRESOURCEを指定可能です。動的属性の値は、認可リクエストによって渡すか、ポリシー決定ポイントによって取得します。リソース属性の値は、リソース・インスタンスによって定義します。

- isSingleValue - trueは、属性が単一の値を取得することを示します。falseの値は複数の値を示します。

2.4.3.2 カスタム関数定義

カスタム関数は、外部から実装されたロジックを表し、PDPに返される出力を生成するために使用します。出力された値は条件で使用します。例2-13は、関数を作成するApplicationPolicyを取得して、ExtensionManagerのインスタンスを取得することによりカスタム関数を作成する方法を示しています。

例2-13 カスタム関数定義の作成

ApplicationPolicy ap = ps.getApplicationPolicy("MyAppPolicy");
ExtensionManager xMgr = ap.getExtensionManager();
FunctionEntry func = xMgr.createFunction("myFunc",
"Credit Standing Function", "Returns credit standing.",
"acme.demo.CreditStanding", OpssBoolean.class, params);

MyAppPolicyは、関数を作成するApplicationPolicyオブジェクトの識別子です。createFunction()メソッドの値は次のように定義されています。

- 名前 - myFuncはFunctionEntryの固有の識別子です。

- 表示名 - Credit Standing FunctionはFunctionEntryのオプションの判読可能名です。

- 説明 - Returns credit standing.はFunctionEntryを説明するオプションの情報です。

- クラス名 - acme.demo.CreditStandingは、FunctionEntryを実装するクラスの完全修飾名です。

- 戻りデータ型 - ポリシー・ストアによってサポートされているすべてのデータ型(OpssBoolean、OpssDate、OpssInteger、OpssString、OpssTime)で構成されたスーパークラスのoracle.security.jps.service.policystore.info.DataTypeクラスのサブクラスです。

- 入力データ型 - paramsは、関数の入力データ型を表します。これは、ポリシー・ストアによってサポートされているすべてのデータ型(OpssBoolean、OpssDate、OpssInteger、OpssString、OpssTime)で構成されたスーパークラスのoracle.security.jps.service.policystore.info.DataTypeクラスのサブクラスの1つです。

詳細は、2.4.5項「条件の定義」と7.2項「カスタム関数の開発」を参照してください。

2.4.4 権限セットの定義

1.2項「単純なポリシーの構成」に記載されているとおり、PermissionSetEntryオブジェクトは、1つ以上のResourceActionsEntryオブジェクトを集約するために使用します。ResourceActionsEntryオブジェクトは、保護するリソースと、ポリシーによって許可または拒否するアクションをペアにしたものです。(ResourceActionsEntryオブジェクトの詳細は、2.3.5項「リソースへのアクションのポリシー・ルールの関連付け」を参照してください。)PermissionSetEntryを使用すれば、必要時にResourceActionsEntryオブジェクトをバンドルできます。これは、標準のRBACロール集約のかわりに使用できる構造体です。

注意:

PermissionSetEntryオブジェクトはOracle Entitlements Server管理コンソールで資格として表現されます。

例2-14は、PermissionSetEntryオブジェクトの作成方法を示しています。この例では、ResourceEntryおよびResourceActionsEntryを作成するコードが示されています。domainはPermissionSetManagerのインスタンスを取得するポリシー・ドメインの名前です。

例2-14 PermissionSetEntryの作成

//get the PermissionSetManager
PermissionSetManager psMgr = domain.getPermissionSetManager();

//create a ResourceEntry and ResourceActionsEntry
ResourceManager resMgr = domain.getResourceManager();
ResourceEntry checkingRes = resMgr.createResource("Bob_checking1",
"Bob Checking Account", "Checking account.", type, null);
List<String> actions = new ArrayList<String>();
actions.add(“read”);
actions.add(“write”);
List<ResourceActionsEntry> resActsList = new
ArrayList<ResourceActionsEntry>();
resActsList.add(new BasicResourceActionsEntry(checkingRes, actions));

//create a PermissionSetEntry
PermissionSetEntry permSet =
permSetManager.createPermissionSet("RptsPermSet", "Reports Permission Set",
"Permission set for Reports policy.", resActsList);

createPermissionSet()パラメータの値は次のように定義されています。

- 名前 - RptsPermSetはPermissionSetEntryオブジェクトの固有の識別子です。

- 表示名 - Reports Permission SetはPermissionSetEntryオブジェクトのオプションの判読可能名です。

- 説明 - Permission set for Report policy.はPermissionSetEntryオブジェクトを説明するオプションの情報です。

- ResourceActionsEntry - resActsListは、このPermissionSetEntryオブジェクトに関連付けられている、ResourceActionsEntryです。

2.4.5 条件の定義

ポリシー・ルールのオプションの条件は、アクセスのリクエストに応答して返される決定に追加の要求を設定するために使用します。たとえば、条件の使用により、リクエストが特定の場所で発行された場合、または特定の時間に発行された場合にのみリソースへのアクセス権を付与することができます。条件は式の形で作成され、trueかfalseかが決定されます。式の結果がtrueの場合、ポリシーの条件は満たされ、ポリシーが適用されます。式の結果がtrueでない場合、ポリシーは適用されません。

注意:

ロール・マッピング・ポリシーの条件は、認可ポリシーの条件と同じ機能を提供し、同じ形式を使用しています。

条件は、2.3.6項「ポリシー・ルールの指定」の説明のとおり、PolicyRuleEntryに定義します。これは属性と関数を使用して作成した式であり、オプションで、詳細に制限するためにポリシー・ルールに追加できます。式は、動的またはリソース属性の値、あるいはコンポーネントの関数から返された値を使用して評価されます。

条件はtrueまたはfalseを返す必要があるため、式はtrueまたはfalseしか返すことができません。したがって、BooleanExpressionEntryで定義する必要があります。BooleanExpressionEntryでは、次の操作が可能です。

- ExpressionComponentオブジェクトを数に制限なく使用できます。
式オブジェクトは、式と、ExpressionComponent型の1つ以上の引数を含みます。ExpressionComponentインタフェースは、式の要素として使用可能なあらゆるエンティティを表します。

注意:

式にコンポーネントを追加する順序は、入力パラメータのリストに表示されているパラメータの順序と同じにする必要があります。たとえば、関数が(OpssString, OpssTime, OpssInteger)を要求する場合、式を次のように作成する必要があります。

ex.addExpressionComponent(<string param>);
ex.addExpressionComponent(<time param>);
ex.addExpressionComponent(<integer param>);

次のオブジェクトはExpressionComponent型です。

- あらゆるDataTypeオブジェクト
2.1項「Java APIの使用方法」を参照してください。

- AttributeEntry

- ValueCollection

- 式

- ExpressionComponentオブジェクトをネストできます。

- 事前定義またはカスタム関数と、ブールまたは非ブール戻り型を使用できます。

- 関数の入力として事前定義済または動的属性を使用できます。

- 動的属性は、評価時に値が取得されるものです。

- 事前定義済属性は、値がポリシーまたはルールのサブジェクト、リソース、アクションと関連付けられていないものです。たとえば、日中の時刻などがあります。

- 現在サポートされているデータ型のBoolean、Date、Integer、StringおよびTimeのリテラル値(ExpressionComponentとして定義)。

- ANDまたはOR演算子を使用して複数の式から返されたブール値を比較できます。

例2-15は、BooleanExpressionEntryクラスを使用して、式と(オプションの)パラメータを指定する方法を示しています。

例2-15 BooleanExpressionEntryの定義

BooleanExpressionEntry bexp =
new BooleanExressionEntry(expression)

BooleanExpressionEntryパラメータには次の要素があります。

- 組込み関数用のFunctionEntryまたはExtensionManagerを使用して取得するカスタム関数。

- ゼロまたは1つ以上のExpressionComponentオブジェクト。ExpressionComponentは、Class<? extends DataType>、ValueCollection、AttributeEntryおよびExpressionによって実装するインタフェースです。式を作成するために使用できるオブジェクトには、OpssBoolean、OpssDate、OpssInteger、OpssString、OpssTime、ValueCollection、AttributeEntryインタフェースを実装するすべてのクラス、または式自体(ネスト)があります。式は、string1 = string2のような単純な条件や、(((checking_balance + savings_balance) > 10000) AND (customFunc_checkCustomerType(user_name, “GOLD”))のような複雑な条件を表します。

開発者は高いレベルから次の手順を実行して、条件をBooleanExpressionEntryとして定義する必要があります。この手順では、プロセスを詳細記述するロジックが定義済であると仮定されています。この例では、銀行のポリシーは、普通預金と当座預金の合計残高が$10,000以上のGOLDメンバーのユーザーのみに適用可能であると仮定されています。

1. AttributeEntryオブジェクトを定義するロジックの個々のコンポーネントを分離します。この例では、普通預金と当座預金の残高の合計($10,000との比較)を定義する属性と、顧客の種類を定義する属性(GOLDとの比較)です。

2. FunctionEntryオブジェクトを定義するコンポーネントごとに暗黙的に存在する関数を特定します。この例では、合計残高を作成する関数(saving_balance + checking_balance > 10000)と顧客のタイプをチェックする関数(customFunc_checkCustomerType(username, “GOLD”))になります。

3. ExpressionComponentオブジェクトを1つずつ作成し、関数およびパラメータとして識別します。この例では、式がネストされ、AND演算子が使用されています。

- integer_add(saving_balance, check_balance)

- integer_greater_than(integer_add
(saving_balance, check_balance), 10000)

- customFunc_checkCustomerType(username, “GOLD”)

- and(integer_greater_than(integer_add
(saving_balance, check_balance), 10000,
customFunc_checkCustomerType(username, “GOLD”))

4. BooleanExpressionEntryをExpressionComponentオブジェクトを使用して作成します。例2-16は推奨されるブール式の生成方法を示しています。

例2-16 BooleanExpressionEntryの作成

//Define the checking and savings balances and compute one total

Expression addBalance = new Expression(function entry for integer_add);
addBalance.add(attribute entry for savings_balance);
addBalance.add(attribute entry for checking_balance);

//Compare the total balance to 10,000

Expression greaterThan = new Expression
(function entry for integer_greater_than);
greaterThan.addExpressionComponent(addBalance);
greaterThan.addExpressionComponent(new OpssInteger(10000));

//Define the function to check the customer type

Expression goldMember = new Expression(function entry for customFunc_checkCustomerType);
goldMember.addExpressionComponent(attribute entry for username);
goldMember.addExpressionComponent(new OpssString(“GOLD”));

//Compare the outcome using AND operator

Expression top = new Expression(function entry for AND);
top.addExpressionComponent(greaterThan);
top.addExpressionComponent(goldMember);

式コンストラクタが関数エントリに提供されており、それぞれの関数の引数が左から右へ式コンポーネントとして追加されています。

注意:

すべてのExpressionComponentオブジェクトを一度に追加するにはsetExpressionComponent(List<ExpressionComponent>)インタフェースを使用します。コンポーネントのリストは、引数が渡される順序に作成する必要があります。たとえば、リストの最初のコンポーネントは、関数に最初に渡される引数であり、2番目のコンポーネントは2番目の引数のようになります。

5. BooleanExpressionEntryを作成します。

Oracle Entitlements Serverでは、条件で使用するための多数の事前定義済関数がサポートされています(AND/OR、ブール関数、文字列関数など)。次の項では、使用可能な式の種類に関する情報について説明します。

- 2.4.5.1項「ブール式の作成」

- 2.4.5.2「カスタム関数式の作成」

2.4.5.1 ブール式の作成

ブール式は、2つのブールの結果の比較に基づいた結果を評価できます。比較の結果はtrueまたはfalseになります。ブール式では、異なる値の型を持つ複数の基本式を基にしたポリシー条件を使用できます。

次のコードには2つの基本式と1つのブール式が含まれています。整数式(2つの整数を比較)と文字列式(2つの文字列を比較)は基本式です。ブール式は、基本式によって返された結果を比較しています。

Expression leftExpression =
new Expression(function-entry-for-INTEGER_LESS_THAN);
leftExpression.add(attribute entry for userBudget);
leftExpression.add(new OpssInteger(2000));

Expression rightExpression =
new Expression(function-entry-for-STRING_EQUAL);
rightExpression.addExpressionComponent(thisMonth);
rightExpression.addExpressionComponent(new OpssString("December"));

Expression expression = new Expression(function-entry-for-AND);
expression.addExpressionComponent(leftExpression);
expression.addExpressionComponent(rightExpression);

//boolean expression
RuleExpressionEntry<OpssBoolean> condition =
new BooleanExpressionEntry<OpssBoolean>(expression);

パラメータの値は次のように定義されています。

- userBudget - ドルの金額を表す動的属性

- 2000 - 整数の定数値

- function-entry-for-INTEGER_LESS_THAN - (ExtensionManager.getFunctionEntry(BuiltInFunctions.INTEGER_LESS_THAN)列挙を使用して取得したFunctionEntryを取ります。

- thisMonth - 当月を表す動的属性

- December - 文字列の定数

- function-entry-for-STRING_EQUAL - (ExtensionManager.getFunctionEntry(BuiltInFunctions.STRING_EQUAL)列挙を使用して取得したFunctionEntryを取ります。

- leftExpression / rightExpression - 基本式の結果を表す動的属性

- December - 文字列の定数

- function-entry-for-AND - (ExtensionManager.getFunctionEntry(BuiltInFunctions.AND)列挙を使用して取得したFunctionEntryを取ります。

注意:

ANDは、基本式の結果もtrueの場合のみtrueを返します。他にサポートされているブール式の演算は、NOT(単独のtrue/falseの値を取り否定します)と、OR(2つのtrue/false値を取り、いずれかのオペランドがtrueの場合に1つのtrueの結果を生成します)です。

2.4.5.2 カスタム関数式の作成

カスタム関数式はカスタム関数を呼び出し、結果に基づいてtrueまたはfalseを返します。カスタム関数式には、1つ以上のパラメータを含めることもできます。関数をコールし、なんらかのパラメータを定義したら、そのパラメータを入力として使用する関数を呼び出すためにRuleExpressionEntryオブジェクトを作成します。次のコードは、リクエストを行ったクライアントを低リスクと見なすことができるかどうかを判定します。関数がクライアントのタイプを分析し、低リスクの場合にはLow Riskの文字列を返します。

//get the ClientType custom function
FunctionEntry function = xMgr.getFunction("ClientType");
Expression ex = new Expression(function);

//add component referencing "LowRisk" string to expression
ex.addExpressionComponent(new OpssString("LowRisk");

//construct BooleanExpressionEntry to invoke function
RuleExpressionEntry<OpssBoolean> = new BooleanExpressionEntry(ex);

2番目の例は、式の異なる値の型のパラメータを取得するカスタム関数式を作成する方法を示しています。

// define the acceptable expression value types
List<Class<? extends DataType>> inputParams =
new ArrayList<Class <? extends DataType>>();
inputParams.add(OpssInteger.class);
inputParams.add(OpssString.class);
inputParams.add(OpssTime.class
);

// declare the function
FunctionEntry func = extensionManager.createFunction(“ReportsPolicyCondition”,
“ReportsPolicyCondition”, “Condition for Reports policy.”,
“oracle.demo.oes.ComplexFunction”, OpssBoolean.class, inputParams);

// use the function to construct a condition
AttributeEntry<OpssInteger> attrEntry =
extMngr.getAttribute(BuiltInAttributes.SYS_OBJ.toString());

Expression expression = new Expression (func)

expression.addExpressionComponent(new OpssInteger(100));
expression.addExpressionComponent(attrEntry);
expression.addExpressionComponent(new OpssTime(17, 0, 0));

RuleExpressionEntry<OpssBoolean> condition =
new BooleanExpressionEntry <OpssBoolean>(expression);

注意:

カスタム関数式は、比較演算を使用しません。

2.4.6 義務の追加

義務は、ポリシー実行の間.に考慮されるオプションの情報を指定します。この情報は、認可の決定をコールしたエンティティに、解決された結果(GRANTまたはDENY)とともに返され、ポリシーの結果に追加の要件が適用されます。たとえば、特定の金額が当座預金口座から引き出された場合に、口座の名義人の登録携帯電話にテキスト・メッセージが送信されます。

義務は、一連の名前と値のペアを含んだ名前付きオブジェクトとして管理されます。このオブジェクトは、常にポリシーのコンテキストで管理されます。義務を定義するには次の2つの方法があります。

- 絶対値を持つ属性が義務として返される静的な定義

- 属性値またはカスタム関数が実行時に評価され、出力が義務として返される動的な定義

ポリシーに義務が含まれている場合、情報は一連の属性を含む名前付きのObligationEntryオブジェクトとしてアプリケーションに返されます。義務を指定するには、戻す値を含んだObligationEntryオブジェクトを作成します。次の手順では、Trader managers may run reports.という文字列メッセージを提供するObligationEntryを作成します。

1. AttributeAssignmentクラスを使用してメッセージ文字列を定義し、traderRptListという名前の属性の配列リストに追加します。

AttributeAssignment<OpssString>traderRpt = new
AttributeAssignment<OpssString>
("traderRptMessage", new OpssString("Trader managers may run reports."));
List<AttributeAssignment<? extends DataType>> traderRptList =
new ArrayList<AttributeAssignment<? extends DataType>>();
traderRptList.add(traderRpt);

パラメータの値は次のように定義されています。

- 名前 - traderRptMessageは文字列の固有の識別子です。

- OpssString - Trader managers may run reports.は文字列です。

2. traderRptObl義務およびtraderRptOblList配列をObligationEntryインタフェースを使用して作成します。

ObligationEntry traderRptObl = new BasicObligationEntry
("traderRptObl", "Trader Report Obligation",
"obligation for Trader Report policy.", traderRptList);
List<ObligationEntry>traderRptOblList = new ArrayList<ObligationEntry>();
traderRptOblList.add(traderRptObl);

パラメータの値は次のように定義されています。

- 名前 - traderRptOblは義務の固有の識別子です。

- 表示名 - Trader Report Obligationは義務のオプションの判読可能名です。

- 説明 - Obligation for Trader Report policy.は義務のオプションの説明です。

- 割当て - traderRptListは前に作成した属性配列リストです。

3. ポリシーの作成時に義務を指定します。

PolicyEntry policyEntry = policyManager.createPolicy
("TraderRpt", "TraderRpt", "Trader report policy.", traderRptRule,
traderRptPermissionSetEntryList, traderRptPrincipals, traderRptOblList);

パラメータの値は次のように定義されています。

- 名前 - TraderRptはポリシーの固有の識別子です。

- 表示名 - TraderRptはポリシーのオプションの判読可能名です。

- 説明 - Trader Report policy.はオプションの説明です。

- ルール - traderRptRuleはPolicyRuleEntryオブジェクトの名前です。

- PermSets - traderRptは、PermissionSetEntryオブジェクトのリストです。

- プリンシパル - traderRptPrincipalsは、PrincipalEntryオブジェクトのリストです。

- 義務 - traderRptRuleはObligationEntryオブジェクトのリストです。

注意:

アプリケーションで義務を使用する場合は、isAccessAllowed()認可リクエストで、リクエストする必要があります。

2.5 サンプル・コードへのアクセス

http://www.oracle.com/technetwork/middleware/oes/overview/index.htmlには、Oracle Entitlements Serverの開発および管理例のリストがあります。

3 ポリシー・オブジェクトのプログラムによる管理

第2章「プログラムによるポリシーの作成」に記載されているアプリケーション・プログラミング・インタフェース(API)の多くは、プログラムによってポリシー・オブジェクトを管理可能なメソッドを含んでいます。この章では、それらのメソッドの使用方法について説明します。この章には次の項目があります。

- 3.1項「Oracle Entitlements Serverを使用したポリシーの管理」

- 3.2項「範囲レベルを使用したポリシー・オブジェクトの管理」

3.1 Oracle Entitlements Serverを使用したポリシーの管理

Oracle Entitlements Serverでは、管理者がすべてのポリシーおよびグローバル・オブジェクトでの作成、読取り、更新および削除(CRUD)操作を実行できます。これは、次の方法のいずれかで実行できます。

- 管理APIの使用(3.2項「範囲レベルを使用したポリシー・オブジェクトの管理」を参照)

- 管理コンソールの使用方法(『Oracle Fusion Middleware Oracle Entitlements Server管理ガイド』を参照)

- コマンド・ラインでのWebLogic Scripting Toolの使用方法(『Oracle Fusion Middleware Oracle Entitlements Server管理ガイド』を参照)

3.2 範囲レベルを使用したポリシー・オブジェクトの管理

ポリシー・ストアには、トップ・レベルのポリシー・ストア自体と、アプリケーション(アプリケーション・ポリシー)およびポリシー・ドメインの3つの範囲レベルがあり、それらの配下でポリシーが管理されます。

- PolicyStoreオブジェクトはポリシー・ストア全体を表します。アプリケーション・ポリシーとシステム管理ポリシーは、この範囲で管理されます。ポリシー管理アクティビティの前に、2.3.1項「ポリシー・ストアへのアクセス」に記載されているように、PolicyStoreオブジェクトのインスタンスを取得する必要があります。ポリシー・ストアの場所へのアクセスには、アカウントとアカウントのパスワードを使用します。これらは、Oracle Platform Security Servicesの構成ファイルのjps-config.xmlに定義されています。例3-1は、この情報をインストール時にjps-config.xmlに定義する方法を示しています。

例3-1 jps-config.xmlでのポリシー・ストアの定義

<jpsConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://
xmlns.oracle.com/oracleas/schema/jps-config-11_0.xsd">
<serviceProviders>
<serviceProvider type="POLICY_STORE" name="policy.db"
class="oracle.security.jps.internal.policystore.OPSSPolicyStoreProvider">
<property name="policystore.type" value="DB_ORACLE"/>
<property name="repository.type" value="database"/>
</serviceProvider>
</serviceProviders>
<serviceInstances>
<serviceInstance name="policystore.db" provider="policy.db">
<property name="jdbc.url"
value="jdbc:oracle:thin:@10.182.219.120:1521:mc"/>
<property name="jdbc.driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="bootstrap.security.principal.key" value="bootstrap"/>
<property name="bootstrap.security.principal.map"
value="BOOTSTRAP_JPS"/>
<property name="oracle.security.jps.ldap.root.name"
value="cn=farm,cn=JPSContext,cn=jpsroot"/>
</serviceInstance>
</serviceInstances>
<jpsContexts default="default">
<jpsContext name="default">
<serviceInstanceRef ref="policystore.db"/>

</jpsContext>
</jpsContexts>
</jpsConfig>

注意:

jps-config.xml構成ファイルの詳細は、『Oracle Fusion Middlewareセキュリティ・ガイド』を参照してください。Oracle Entitlements Server固有のパラメータは、『Oracle Fusion Middleware Oracle Entitlements Server管理者ガイド』を参照してください。

詳細は、3.2.1項「PolicyStoreの範囲で作成されたオブジェクトの管理」を参照してください。

- ApplicationPolicyオブジェクトは、Oracle Entitlements Serverによって保護されるアプリケーションを表します。ApplicationPolicy内では、ポリシーを管理するために使用するプログラム・オブジェクトのResourceTypeEntry、FunctionEntry、AppRoleEntryおよびRolePolicyEntryが管理されます。

注意:

これらのプログラム・オブジェクトは、オプションで、ApplicationPolicy内に1つ(以上の)PolicyDomainEntryオブジェクトを作成して管理することもできます。次の箇条書きと第5章「ポリシー管理の委任」を参照してください。

詳細は、3.2.2項「ApplicationPolicy範囲内でのオブジェクトの管理」を参照してください。

- オプションのPolicyDomainEntryオブジェクトは、パーティションに作成することができ、ポリシー・オブジェクトや指定済のポリシー定義に対する管理ポイントとなります。PolicyDomainEntryを1つ使用して、アプリケーションを保護するすべてのポリシーを管理するか、複数使用して必要時にポリシー・コンポーネントを編成できます。ポリシーは、その親のApplicationPolicyオブジェクトで作成されたオブジェクトを使用して定義します。ポリシー・ドメインどうしは、親と子の関係でも互いに不可視です。したがって、あるポリシー・ドメインで管理されるリソース、権限セットおよびポリシーは、そのポリシー・ドメインのみで使用できます。ポリシー・ドメインの詳細は、第5章「ポリシー管理の委任」を参照してください。
詳細は、3.2.3項「PolicyDomainEntry範囲内でのオブジェクトの管理」を参照してください。

管理ロールは、作成された場所に応じてすべての範囲レベルで管理されます。管理ロールの作成および管理は、第5章「ポリシー管理の委任」を参照してください。

次の項では、さらに詳しい情報をについて説明します。

- 3.2.1項「PolicyStoreの範囲で作成されたオブジェクトの管理」

- 3.2.2項「ApplicationPolicy範囲内でのオブジェクトの管理」

- 3.2.3項「PolicyDomainEntry範囲内でのオブジェクトの管理」

3.2.1 PolicyStoreの範囲で作成されたオブジェクトの管理

PolicyStoreオブジェクト内では、異なるアプリケーションを保護するポリシー・コンポーネントが2番目のレベルの1つまたは複数のApplicationPolicyオブジェクト内に編成されます。2.3.2項「アプリケーション・ポリシーの作成」では、ApplicationPolicyオブジェクトの作成方法について説明しました。また、ApplicationPolicyオブジェクトは、PolicyStoreインタフェースのメソッドによって削除または取得できます。

注意:

ApplicationPolicyオブジェクトは、Oracle Entitlements Server管理コンソールでアプリケーションとして表現されます。

例3-2は、Tradingという名前のApplicationPolicyオブジェクトをdeleteApplicationPolicy()メソッドを使用して削除する方法を示しています。

例3-2 deleteApplicationPolicy()メソッドの使用方法

PolicyStore ps = ctx.getServiceInstance(PolicyStore.class);
ApplicationPolicy ap = ps.deleteApplicationPolicy("Trading");

deleteApplicationPolicy()パラメータの値はTradingです。これはオブジェクトが最初に作成されたときに名前として定義された固有識別子です。getApplicationPolicy()メソッドは、これと同じ名前の値を使用してApplicationPolicyオブジェクトを取得します。さらに、getApplicationPolicies()メソッドをコールし、ApplicationPolicySearchQueryクラスを使用して検索条件を渡すことで多数のApplicationPolicyオブジェクトを取得できます。

注意:

ApplicationPolicyオブジェクトを削除すると、その中に作成されたすべての子オブジェクトも削除されます。

3.2.2 ApplicationPolicy範囲内でのオブジェクトの管理

ApplicationPolicyオブジェクト内では、ポリシー・コンポーネントが1つまたは複数のPolicyDomainEntryオブジェクト内に編成されます。ApplicationPolicyレベルで管理されるその他のコンポーネントには、リソース・タイプ、アプリケーション・ロール、ロール・ポリシーおよび拡張機能(関数および属性)があります。詳細は、次の各項を参照してください。

- 3.2.2.1項「PolicyDomainEntryオブジェクトの管理」

- 3.2.2.2項「ResourceTypeEntryオブジェクトの管理」

- 3.2.2.3項「AppRoleEntryオブジェクトの管理と付与」

- 3.2.2.4項「ロール・マッピング・ポリシー(RolePolicyEntry)オブジェクトの管理」

- 3.2.2.5項「AttributeEntryおよびFunctionEntryオブジェクトの管理」

- 3.2.2.6項「ResourceEntryオブジェクトの管理」

- 3.2.2.7項「権限セットの管理」

- 3.2.2.8,項「ポリシーの管理」

3.2.2.1 PolicyDomainEntryオブジェクトの管理

5.7項「ポリシー・ドメインの委任」では、ポリシー定義コンポーネントのパーティションを作成するために使用できるPolicyDomainEntryオブジェクトの作成方法について説明しています。また、PolicyDomainEntryオブジェクトは、ApplicationPolicyインタフェースのメソッドによって削除または取得できます。ポリシー・ドメインを管理するには、PolicyDomainManagerのインスタンスを取得して、適切なメソッドをコールします。例3-3は、Tradingという名前のApplicationPolicy内で作成されたPolicyDomainEntryの削除方法を示しています。mydomainは、オブジェクトが最初に作成されたときに名前として定義された固有の識別子です。

例3-3 deletePolicyDomain()メソッドの使用方法

PolicyDomainManager domainMgr = Trading.getPolicyDomainManager();
PolicyDomainEntry pdEntry = domainMgr.deletePolicyDomain("mydomain");

例3-4はインタフェースにあるsetDescription()およびsetDisplayName()メソッドを使用してPolicyDomainEntryの表示名と説明を変更する方法を示しています。

例3-4 modifyPolicyDomain()メソッドの使用方法

PolicyDomainManager domainMgr = Trading.getPolicyDomainManager();

PolicyDomainManager domainMgr = Trading.getPolicyDomainManager();
PolicyDomainEntry pdEntry = domainMgr.getPolicyDomain("mydomain");

// modify PolicyDomainEntry displayName and description
pdEntry.setDescription("This is description.");
pdEntry.setDisplayName("Domain Display Name");

// persist the change
domainMgr.modifyPolicyDomain(pdEntry);

例3-5は、mydomainを使用してPolicyDomainEntryを取得する方法を示しています。mydomainは、オブジェクトが最初に作成されたときに名前として定義された固有の識別子です。

例3-5 getPolicyDomain()メソッドの使用方法

PolicyDomainManager domainMgr = Trading.getPolicyDomainManager();
PolicyDomainEntry PDEntry = domainMgr.getPolicyDomain("mydomain");

さらに、getPolicyDomains()メソッドをコールし、PolicyDomainSearchQueryクラスを使用して検索条件を渡すことで多数のPolicyDomainEntryオブジェクトを取得できます。

3.2.2.2 ResourceTypeEntryオブジェクトの管理

2.3.3項「リソース・タイプの定義」では、ResourceTypeEntryオブジェクトの作成方法について説明しました。また、ResourceTypeEntryオブジェクトは、ResourceTypeManagerのインスタンスを取得し(ApplicationPolicyインタフェースのgetResourceTypeManager()を使用)、適切なメソッドをコールすることによって削除、変更および取得できます。

注意:

ResourceTypeEntryオブジェクトは、Oracle Entitlements Server管理コンソールでリソース・タイプとして表現されます。

例3-6では、TradingというApplicationPolicyオブジェクト内のTradingResTypeという名前のResourceTypeEntryを削除しています。

例3-6 deleteResourceType()メソッドの使用方法

//get the ResourceTypeManager
ResourceTypeManager resourceTypeManager = Trading.getResourceTypeManager();

//delete the Resource Type
resourceTypeManager.deleteResourceType("TradingResType", "true");

Tradingは、ResourceTypeオブジェクトが作成されたApplicationPolicyの名前です。TradingResTypeは削除するResourceTypeオブジェクトの名前です。deleteResourceType()パラメータの値は次のように定義されています。

- 名前 - TradingResTypeは、オブジェクトが最初に作成されたときに名前として定義された固有の識別子です。

- cascadeDelete - このパラメータは、trueまたはfalseの値を取り、ResourceTypeEntryと関連するオブジェクトの削除方法を管理します。trueの場合、ResourceTypeEntryと、インスタンス化されたすべてのResourceEntryオブジェクトが削除されます。falseで、ResourceEntryインスタンスが存在する場合には、処理が失敗し、PolicyStoreOperationNotAllowedExceptionがスローされます。

getResourceType()メソッドはResourceTypeEntryを取得するために使用でき、名前によって取得することもできます。getResourceTypes()メソッドをコールし、ResourceTypeSearchQueryクラスを使用して検索条件を渡すことで多数のResourceTypeEntryオブジェクトを取得できます。

3.2.2.3 AppRoleEntryオブジェクトの管理と付与

2.4.1項「アプリケーション・ロールの作成」では、AppRoleEntryオブジェクトの作成方法と、AppRoleEntryへのユーザーの割当て方法について説明しました。(次にAppRoleEntryオブジェクトを特定のポリシーに対してプリンシパルとして指定すると、ロールに割り当てられたすべてのユーザーがそのポリシーによって管理されます。)また、AppRoleEntryオブジェクトは、AppRoleManagerのインスタンスを取得し(ApplicationPolicyインタフェースのgetAppRoleManager()を使用)、適切なメソッドをコールすることによって削除、変更および取得できます。

注意:

AppRoleEntryオブジェクトは、Oracle Entitlements Server管理コンソールでアプリケーション・ロールとして表現されます。アプリケーション・ロールは、管理コンソールのナビゲーション・ツリーの「ロール・カタログ」ブランチで検索され、この配下にまとめられます。ロール・カタログは、アプリケーション・ロールとその性質の管理に関連するすべてのアクティビティをグループ化するユーザー・インタフェースです。ロール・カテゴリは管理を容易にするためにロールに割り当てることができるタグです。

例3-7はTradingAppRoleという名前のAppRoleEntryをポリシー・ストアから削除しています。TradingAppは、AppRoleEntryオブジェクトが作成されたApplicationPolicyの名前です。

例3-7 deleteAppRole()メソッドの使用方法

//get the AppRoleManager
AppRoleManager appRoleManager = Trading.getAppRoleManager();

//delete the AppRoleEntry
appRoleManager.deleteAppRole("TradingAppRole", "true");

deleteAppRole()パラメータの値は次のように定義されています。

- 名前 - TradingAppRoleは、オブジェクトが最初に作成されたときに名前として定義された固有の識別子です。

- cascadeDelete - このパラメータは、trueまたはfalseの値を取り、AppRoleEntryと関連するオブジェクトの削除方法を管理します。trueの場合、AppRoleEntryが削除され、これを参照しているすべてのポリシーから取り除かれます。(ポリシーが参照しているのがそのロールのみ場合は、ポリシーも削除されます。)falseで、ロールがいずれかのポリシーで参照されている場合には、処理が失敗し、PolicyStoreOperationNotAllowedExceptionがスローされます。

getAppRole()メソッドは、名前を渡すことでAppRoleEntryを取得するために使用できます。getAppRoles()メソッドをコールし、AppRoleSearchQueryクラスを使用して検索条件を渡すことで多数のAppRoleEntryオブジェクトを取得できます。さらに、modifyAppRole()メソッドによってAppRoleEntryを変更し、getDirectAppRoleMembers()メソッドによってアプリケーション・ロールが直接付与されたメンバーを取得し、getDirectGrantedAppRoles()メソッドによって特定のプリンシパルに対するアプリケーション・ロール階層を取得できます。

AppRoleEntryの取消しは、revokeAppRole()メソッドを使用して行えます。1つ以上のPrincipalEntryオブジェクトへのAppRoleEntryの付与は、grantAppRole()メソッドを使用して静的に行うか、ロール・マッピング・ポリシーを使用して動的に行えます。

注意:

ロール・マッピング・ポリシーでは、プリンシパル(ユーザー、グループ)、ターゲット(リソース、リソース名の式)および(オプションの)条件を定義できます。認可ポリシーは、アプリケーション・ロールをアクセス権限にマップするために使用します。認可ポリシーには、プリンシパル(ユーザー、グループ、アプリケーション・ロール)、ターゲット(リソース、資格セット、リソース名の式)、条件および義務を定義できます。詳細は、3.2.2.4項「ロール・マッピング・ポリシー(RolePolicyEntry)オブジェクトの管理」を参照してください。

アプリケーション・ロールは継承および階層も使用します。ロールは、プリンシパルがロールに割り当てられる(ロール・マッピング・ポリシーを使用)階層で作成でき、(他に構成されたポリシーにより禁止されないかぎり)子ロールにも継承されます。子のロールを基にアクションが付与されたユーザーは、そのロールの親からのアクションを継承します。親のロールを基にアクションが拒否されたユーザーは、そのロールの子のアクションも拒否されます。

3.2.2.4 ロール・マッピング・ポリシー(RolePolicyEntry)オブジェクトの管理

2.4.2項「ロール・マッピング・ポリシーの作成」ではRolePolicyEntryオブジェクトの作成方法について説明しました。また、RolePolicyEntryオブジェクトは、RolePolicyManagerのインスタンスを取得し(ApplicationPolicyインタフェースのgetRolePolicyManager()を使用)、適切なメソッドをコールすることによって削除、変更および取得できます。例3-8では、TellerAppというApplicationPolicyオブジェクト内のTellerRoleMappingという名前のRolePolicyEntryを削除する方法を示しています。

例3-8 deleteRolePolicy()メソッドの使用方法

//get the RolePolicyManager
RolePolicyManager rolePolicyManager = tellerApp.getRolePolicyManager();

//delete the RolePolicyEntry
rolePolicyManager.deleteRolePolicy("TellerRoleMapping");

例3-9では、modifyRolePolicy()メソッドにオブジェクトの修正されたインスタンスを渡すことでRolePolicyEntryを修正する方法を示しています。

例3-9 modifyRolePolicy()メソッドの使用方法

//get the RolePolicyManager
RolePolicyManager rolePolicyManager = tellerApp.getRolePolicyManager();

// get the policy
RolePolicyEntry rolePolicy = rolePolicyManager.getRolePolicy("TellerRoleMapping");

// change description
rolePolicy.setDescription("the policy is changed!");

//persist the change
rolePolicyManager.modifyRolePolicy(rolePolicy);

getRolePolicy()メソッドは、名前を渡すことでRolePolicyEntryを取得するために使用できます。getRolePolicies()メソッドをコールし、RolePolicySearchQueryクラスを使用して検索条件の配列を渡すことで多数のRolePolicyEntryオブジェクトを取得できます。

3.2.2.5 AttributeEntryおよびFunctionEntryオブジェクトの管理

2.4.3項「属性と関数定義の作成」では、(オプション)でポリシーの条件と義務で使用するAttributeEntry定義とFunctionEntry定義の作成方法について説明しました。また、これらのオブジェクトは、ExtensionManagerをコールすることで削除、変更または取得できます。次の各項では、詳細を説明します。

- 3.2.2.5.1項「AttributeEntryオブジェクトの管理」

- 3.2.2.5.2,項「FunctionEntryオブジェクトの管理」

3.2.2.5.1 AttributeEntryオブジェクトの管理

例3-10では、ポリシー・ストアからPhoneという名前のAttributeEntryオブジェクトを取得しています。bankApplicationは、ExtensionManagerをインスタンス化するApplicationPolicyオブジェクトを参照します。Phone は、AttributeEntryオブジェクトが最初に作成されたときに名前として定義された固有の識別子を参照します。

例3-10 getAttribute()メソッドの使用方法

//get the ExtensionManager
ExtensionManager extMgr = bankApplication.getExtensionManager();

//retrieve the attribute
AttributeEntry<? extends DataType> oneAttrEntry =
extMgr.getAttribute("Phone");

getAttributes()メソッドをコールし、AttributeSearchQueryクラスを使用して検索条件を渡すことで多数のAttributeEntryオブジェクトを取得できます。例3-11では、ApplicationPolicyからAttributeEntryを削除しています。

例3-11 deleteAttribute()メソッドの使用方法

//get the ExtensionManager
ExtensionManager extMgr = bankApplication.getExtensionManager();

//retrieve the attribute
AttributeEntry<? extends DataType> oneAttrEntry =
extMgr.deleteAttribute("myattr", false);

注意:

deleteAttribute()メソッドを実行する前に、AttributeEntryを参照するポリシーから該当するAttributeEntryを削除します。属性を使用中の場合は削除されず、PolicyStoreOperationNotAllowedExceptionがスローされます。このリリースでは、cascadeDeleteパラメータをfalseにする必要があります。

AttributeEntryオブジェクトを変更するには、新しい変更された値を持つオブジェクトをmodifyAttribute()メソッドを使用してExtensionManagerに渡します。オブジェクトを渡す前に、AttributeEntryインタフェースにあるメソッドを使用して新しい変更する値を設定します。

3.2.2.5.2 FunctionEntryオブジェクトの管理

例3-12では、ポリシー・ストアからClientTypeという名前のFunctionEntryオブジェクトを取得しています。bankApplicationは、ExtensionManagerをインスタンス化するApplicationPolicyオブジェクトを参照します。ClientTypeは、FunctionEntryオブジェクトが最初に作成されたときに名前として定義された固有の識別子を参照します。

例3-12 getFunction()メソッドの使用方法

//get the ExtensionManager
ExtensionManager extMgr = bankApplication.getExtensionManager();

//retrieve the function
FunctionEntry oneFuncEntry = extMgr.getFunction("ClientType");

getFunctions()メソッドをコールし、FunctionSearchQueryクラスを使用して検索条件を渡すことで多数のFunctionEntryオブジェクトを取得できます。例3-13では、ApplicationPolicyからFunctionEntryを削除しています。

例3-13 deleteFunction()メソッドの使用方法

//get the ExtensionManager
ExtensionManager extMgr = bankApplication.getExtensionManager();

//remove the function
extMgr.deleteFunction("ClientType", false);

FunctionEntryオブジェクトを変更するには、新しい変更された値を持つオブジェクトをmodifyFunction()メソッドを使用してExtensionManagerに渡します。オブジェクトを渡す前に、FunctionEntryインタフェースにあるメソッドを使用して新しい変更する値を設定します。

3.2.2.6 ResourceEntryオブジェクトの管理

2.3.4項「リソースのインスタンス化」では、ResourceTypeEntryオブジェクトからResourceEntryオブジェクトをインスタンス化する方法について説明しました。また、ResourceEntryオブジェクトは、ResourceManagerのインスタンスを取得し(ApplicationPolicyインタフェースまたは管理を委任するためにポリシー・ドメインを使用している場合はPolicyDomainEntryインタフェースで、getResourceManager()を使用)、適切なメソッドをコールすることによって削除、変更および取得できます。

注意:

ResourceEntryオブジェクトは、Oracle Entitlements Server管理コンソールでリソースとして表現されます。

例3-14は、ResourceEntryオブジェクトの取得方法を示しています。getResource() メソッドは、ResourceManagerインタフェースで拡張されたResourceFinderで定義されています。このメソッドに、リソース・タイプの定義済の名前とリソースを渡すことで、ResourceEntryが返されます。

例3-14 getResource()メソッドの使用方法

//get the ResourceManager
ResourceManager resMgr = domain.getResourceManager();

//retrieve the Resource
ResourceEntry checkingRes = resMgr.getResource
("WidgetType", "WidgetResource")

例3-15は、当座預金口座のResourceEntryを削除します。domainは、ResourceManagerを取得するPolicyDomainEntryオブジェクトを参照します。このメソッドに、リソース・タイプの定義済の名前とリソースを渡すことで、ResourceEntryが返されます。

例3-15 deleteResource()メソッドの使用方法

//get the ResourceManager
ResourceManager resMgr = domain.getResourceManager();

//remove the Resource
resMgr.deleteResource("WidgetType", "WidgetResource", true);

deleteResource()パラメータの値は次のように定義されています。

- リソース・タイプ名 - WidgetTypeは、ResourceTypeEntryが最初に作成されたときに名前として定義された固有の識別子です。

- 名前 - WidgetResourceは、ResourceEntryが最初に作成されたときに名前として定義された固有の識別子です。

- cascadeDelete - このパラメータは、trueまたはfalseの値を取り、ResourceEntryと関連するオブジェクトの削除方法を管理します。trueの場合、ResourceEntryを参照しているポリシーからResourceEntryが削除されます。ポリシーが参照しているのがそのオブジェクトのみ場合は、ポリシーも削除されます。falseで、ResourceEntryインスタンスが存在する場合には、処理が失敗し、PolicyStoreOperationNotAllowedExceptionがスローされます。

ResourceEntryオブジェクトは、modifyResource()メソッドをコールし、そのオブジェクト自身へのハンドルをEntryReferenceおよび変更の配列の形式で渡すことで変更することもできます。例3-16に、これを示します。

例3-16 modifyResource()メソッドの使用方法

//get the ResourceManager
ResourceManager resMgr = domain.getResourceManager();

// get resource object
ResourceEntry resEntry = resMgr.get("WidgetType", "WidgetResource");

// create attrName Attribute with value of 'test'
AttributeEntry attrEntry1 = new BasicAttributeEntry("testAttr",
new OpssString("test"));
resEntry.addResourceAttribute(attrEntry1);

// persist the change
resMgr.modifyResource(resEntry);

3.2.2.7 権限セットの管理

2.4.4「権限セットの定義」では、PermissionSetManagerをコールし、createPermissionSet()メソッドを使用することで、PermissionSetEntryオブジェクト内で1つ以上のResourceActionsEntryオブジェクトを編成する方法について説明しています。また、PermissionSetEntryオブジェクトは、PermissionSetManagerのインスタンスを取得し(ApplicationPolicyインタフェースまたは管理を委任するためにポリシー・ドメインを使用している場合はPolicyDomainEntryインタフェースで、getPermissionSetManager()を使用)、適切なメソッドをコールすることによって削除、変更および取得できます。

注意:

PermissionSetEntryオブジェクトはOracle Entitlements Server管理コンソールで資格として表現されます。

例3-17は、2つのResourceActionsEntryオブジェクトを削除することでPermissionSetEntryを変更する方法を示しています。domainは、ポリシーが作成され、さらにPermissionSetManagerを取得するポリシー・ドメインを参照します。

例3-17 PermissionSetEntryの変更

// get the PermissionSetManager
PermissionSetManager psMgr = domain.getPermissionSetManager();

// get the PermissionSet
PermissionSetEntry permSetEntry = psMgr.getPermissionSet("myPermSet");

// get the ResourceActionEntries from PermissionSet
List<ResourceActionsEntry> resultResActions =
permSetEntry.getResourceActionsList();

// delete the first ResourceActionsEntry object
permSetEntry.deleteResourceActions(resultResActions.get(0));

// persist the change
psMgr.modifyPermissionSet(permSetEntry);

例3-18は、PermissionSetEntryオブジェクトの削除方法を示しています。

例3-18 deletePermissionSet()メソッドの使用方法

//get the PermissionSetManager
PermissionSetManager psMgr = domain.getPermissionSetManager();

//remove PermissionSetEntry
psMgr.deletePermissionSet("RptsPermSet", "true");

deletePermissionSet()パラメータの値は次のように定義されています。

- 名前 - RptsPermSetは、オブジェクトが最初に作成されたときに名前として定義された固有の識別子です。

- cascadeDelete - このパラメータは、trueまたはfalseの値を取り、PermissionSetEntryと関連するオブジェクトの削除方法を管理します。trueの場合、PermissionSetEntryを参照しているポリシーからPermissionSetEntryが削除されます。ポリシーが参照しているのがそのオブジェクトのみ場合は、ポリシーも削除されます。falseで、PermissionSetEntryインスタンスが参照されている場合には、処理が失敗し、PolicyStoreOperationNotAllowedExceptionがスローされます。

getPermissionSet()メソッドはPermissionSetEntryを取得するために使用でき、名前によって取得することもできます。getPermissionSets()メソッドをコールし、PermissionSetSearchQueryクラスを使用して検索条件を渡すことで多数のPermissionSetEntryオブジェクトを取得できます。modifyPermissionSet()は、入力として使用されるPermissionSetオブジェクトで定義された変更を永続化します。

3.2.2.8 ポリシーの管理

2.3.8項「ポリシーの定義」では、PolicyRuleEntry、ResourceActionsEntry、PrincipalEntryなど、アクセス制御に必要なすべての要素を統合することで、PolicyEntryオブジェクトを作成する方法について説明しました。PolicyManagerのインスタンスを取得したら、createPolicy()メソッドを使用します。また、PolicyEntryオブジェクトは、PolicyManagerのインスタンスを取得し(ApplicationPolicyインタフェースまたは管理を委任するためにポリシー・ドメインを使用している場合はPolicyDomainEntryインタフェースで、getPolicyManager()を使用)、適切なメソッドをコールすることによって削除、変更および取得できます。

例3-19は、PolicyEntryの表示名と表示パラメータの値を変更する方法を示しています。domainは、ポリシーが作成され、さらにPolicyManagerを取得するポリシー・ドメインを参照します。

例3-19 modifyPolicy()メソッドの使用方法

// get the Policy
PolicyManager policyMgr = domain.getPolicyManager();
PolicyEntry policyEntry = policyMgr.getPolicy("mypolicy");

// update PolicyEntry description and displayName
policyEntry.setDescription("updated description");
policyEntry.setDisplayName("updated display name");

// persist the change
policyMgr.modifyPolicy(policyEntry);

例3-20は、deletePolicy()のメソッドの使用方法を示しています。Bank Policyは、PolicyEntryが作成されたときに名前パラメータの値として定義された固有の識別子を参照します。

例3-20 deletePolicy()メソッドの使用方法

PolicyManager policyMgr = domain.getPolicyManager();
policyManager.deletePolicy("BankPolicy");

getPolicy()メソッドはPolicyEntryを取得するために使用でき、名前によって取得することもできます。getPolicies()メソッドをコールし、PolicySearchQueryクラスを使用して検索条件を渡すことで多数のPolicyEntryオブジェクトを取得できます。modifyPolicy()は、入力として使用されるPolicyEntryオブジェクトで定義された変更を永続化します。

PolicyEntryオブジェクトを検索するには、PolicySearchQueryクラスを使用します。問合せを作成して、次のパラメータに基づいて検索できます。

- 名前

- 表示名

- 説明

- プリンシパル

- 権限セット

- 義務

- 属性

- 関数

詳細は、Oracle Fusion Middleware Oracle Entitlements Server管理Java APIリファレンスを参照してください。

3.2.3 PolicyDomainEntry範囲内でのオブジェクトの管理

ポリシーのパーティション化が必要な場合には、ポリシー定義のコンポーネントを1つ以上のPolicyDomainEntryオブジェクト内で編成できます。このコンポーネントにはリソース、権限セット、ポリシーなどがあります。

注意:

PolicyDomainEntryの作成はオプションです。ポリシーのパーティション化が必要ない場合は、ApplicationPolicyの範囲でポリシー定義コンポーネントを管理してください。

次の項では、ApplicationPolicyの範囲でコンポーネントを管理する方法について説明します。後からパーティション化するためにPolicyDomainEntryを作成済の場合には、これらの同じコンポーネントをPolicyDomainEntryの範囲で管理できます。

- 3.2.2.6項「ResourceEntryオブジェクトの管理」

- 3.2.2.7項「権限セットの管理」

- 3.2.2.8,項「ポリシーの管理」

PolicyDomainEntryの使用に関する情報は、5.7項「ポリシー・ドメインの委任」を参照してください。

4 ポリシーの配布

ポリシーの配布は、ポリシーを構成するために使用するプロセスと、ポリシー決定ポイント(PDP)で使用可能なポリシー・データによって行います。このデータによってポリシーの評価や、認可の付与または拒否の決定が可能となります。この章の内容は次のとおりです。

- 4.1項「ポリシー配布について」

- 4.2項「配布モードの定義」

- 4.3項「セキュリティ・モジュールの構成とバインディング」

- 7.1項「ポリシー配布の開始」

4.1 ポリシー配布について

Oracle Entitlements Serverでのポリシーの管理とポリシーの配布は、異なる操作です。ポリシー管理操作は、ポリシー・ストア内のポリシーを定義、変更および削除するために使用されます。ポリシー配布コンポーネントは、保護されたリソースへのアクセス権を付与または拒否するためにデータを使用するPDPエンドポイント(セキュリティ・モジュール)で、ポリシーを使用可能にします。ポリシーは、配布されるまで適用されません。ポリシー配布には、次のアクションのいずれかまたはすべてが含まれます。

- ポリシー・ストアからのポリシーの読取り。

- メモリー内ポリシー・キャッシュでのポリシー・オブジェクトのキャッシング。このキャッシュはセキュリティ・モジュールによって管理し、認可リクエスト処理で使用されます。

- ポリシー配布コンポーネントに対してローカルな、ポリシー・ストアから独立したファイルベースの永続キャッシュにあるポリシー・オブジェクトの保存。

中央のOracle Entitlements Server管理コンソールと、(保護されたアプリケーションに)ローカルにインストールされたセキュリティ・モジュールの両方に、ポリシー配布コンポーネントが含まれます。このアーキテクチャによって、次の2つのデプロイメント・シナリオが認められます。1つ目は、多くのセキュリティ・モジュールと通信できる集中ポリシー配布コンポーネントに関係し、2つ目は、1つのセキュリティ・モジュールに対してローカルで、1つのセキュリティ・モジュールと通信するポリシー配布コンポーネントに関係します。次の各項では、詳細を説明します。

- 4.1.1項「集中型ポリシー配布コンポーネントの使用方法」

- 4.1.2項「ローカル・ポリシー配布コンポーネントの使用方法」

4.1.1 集中型ポリシー配布コンポーネントの使用方法

集中ポリシー配布コンポーネント・シナリオは、セキュリティ・モジュールのポリシー配布コンポーネント・クライアントと通信するサーバーとして機能する、(管理コンソール内の)ポリシー配布コンポーネントの使用に関係します。図4-1は、このシナリオで、セキュリティ・モジュールのポリシー配布コンポーネント・クライアントがポリシー・ストアと通信しない方法を示します。ポリシーの配布は、Oracle Entitlements Server管理者によって開始され、ポリシー配布コンポーネント・クライアントにプッシュされます。現在、4.2.1項「制御された配布」で説明しているように、制御された方法でのみデータをプッシュできます。このシナリオでは、多くのセキュリティ・モジュールと通信できる集中ポリシー配布コンポーネントが許可されます。

図4-1 Oracle Entitlements Serverポリシー配布コンポーネントの使用方法

「図4-1 Oracle Entitlements Serverポリシー配布コンポーネントの使用方法」の説明

4.1.2 ローカル・ポリシー配布コンポーネントの使用方法

ローカルの(セキュリティ・モジュールへの)シナリオは、ポリシー・ストアと直接通信するセキュリティ・モジュールのポリシー配布コンポーネントに関係します。このシナリオでは、ローカルのポリシー配布コンポーネントは、1つのセキュリティ・モジュールのみと通信できます。アプリケーションは、管理操作を管理し、ポリシー配布コンポーネントのセキュリティ・モジュール・インスタンスがポリシーまたはポリシー・デルタを配布するタイミングを決定します。このデプロイメントでは、図4-2に示すように、ポリシー配布コンポーネントは、(配布されるデータがあるかポリシー・ストアを定期的にチェックすることによって、)ポリシー・ストアからデータをプルし、ポリシー・ストアからポリシー・データを送信して、管理者が開始したポリシー配布の後にPDPに対して使用可能にします。

図4-2 セキュリティ・モジュール・ポリシー配布コンポーネントの使用方法

「図4-2 セキュリティ・モジュール・ポリシー配布コンポーネントの使用方法」の説明

現在、4.2.1項「制御された配布」で説明しているような制御された方法、または、4.2.2項「制御されない配布」で説明しているような制御されない方法のいずれかで、データをプルできます。

4.2 配布モードの定義

Oracle Entitlements Serverでは、アプリケーションおよびサービスを保護する個々のセキュリティ・モジュールへのポリシーの配布タスクを処理します。ポリシー・データは、制御された方法または制御されない方法のいずれかで配布されます。配布モードは、各セキュリティ・モジュールのjps-config.xml構成ファイルで定義されています。指定した配布モードは、そのセキュリティ・モジュールにバインドされたすべてのApplicationPolicyオブジェクトに適用可能です。次の各項では、配布モードの詳細を説明します。

- 4.2.1項「制御された配布」

- 4.2.2項「制御されない配布」

4.2.1 制御された配布

制御された配布は、ポリシー配布コンポーネントによって開始され、PDPクライアント(セキュリティ・モジュール)が最後の配布以降に作成または変更されたポリシー・データを受信することを確認します。この点において、配布は、新規または更新済のポリシー・データを配布するための明示的なアクションを実行する、ポリシー管理者によって制御されます。(ポリシー配布コンポーネントは、ポリシー変更および配布を追跡するバージョニング・メカニズムを維持します。)制御された配布を有効化すると、セキュリティ・モジュールは、ポリシー配布コンポーネントの配布を直接リクエストできません。

注意:

セキュリティ・モジュールが開始し、それ自体を構成IDを持つポリシー配布コンポーネントに登録する場合は例外です。ポリシーは、この登録に基づいて、セキュリティ・モジュールに配布されます。

制御された配布はプッシュまたはプルになります。制御されたプッシュ配布の場合、ポリシー配布コンポーネントは、ローカルの永続キャッシュ(ポリシー・オブジェクトを格納し、ポリシー・ストアから独立するためにPDPによって維持されているファイルベースのキャッシュ)にデータを格納するセキュリティ・モジュールに、新規または更新済のポリシー・データを配布します。制御されたプル配布の場合、セキュリティ・モジュール(とローカルのポリシー配布コンポーネント)は、ポリシー・ストアからの新規および更新されたポリシー・データを取得します。制御されたプッシュ配布は、デフォルトのモードです。

ポリシー配布コンポーネントは、セキュリティ・モジュール・クライアントへの一定のライブ接続を維持しません。ポリシーを配布する前に接続を確立します。そのため、セキュリティ・モジュールは、ポリシーを決定する際にポリシー・ストアに依存しません。ポリシー・ストアがオフラインの場合、それ自体のローカル・キャッシュを使用できます。セキュリティ・モジュールが開始すると、ポリシー・ストアが使用可能かどうかチェックされます。使用不可の場合、セキュリティ・モジュールはローカルの永続キャッシュからポリシー・データを使用します。

ポリシー・データのフラッシュ配布は、distributePolicy()メソッドのflushパラメータを使用することで実行できます。フラッシュ配布は、ポリシー・ストア内のすべてのポリシー・オブジェクトを完全に再配布するための準備として、ローカルに保存されたポリシーをクリーンアップするよう、ポリシー配布コンポーネントがセキュリティ・モジュールに通知する場合に使用します。詳細は、4.4項「ポリシー配布の開始」を参照してください。

注意:

制御された配布は、データベース・タイプのポリシー・ストアでのみサポートされ、LDAPベースのポリシー・ストアではサポートされません。LDAPポリシー・ストア用に配布APIが呼び出される場合、それは操作不能になります。

制御された配布では、ポリシー配布操作のいずれかの部分が失敗すると、配布操作全体が失敗します。ポリシー配布コンポーネントの構成プロパティは、『Oracle Fusion Middleware Oracle Entitlements Server管理者ガイド』の付録を参照してください。

4.2.2 制御されない配布

PDPクライアント(セキュリティ・モジュール)がポリシー・ストアからポリシーおよびポリシー変更を定期的に取得(プル)する場合、これは制御されない配布と呼ばれます。ポリシーの変更は、ポリシー・ストアに保存され、制御されない配布は、その変更を次の定義済の間隔で取得します。制御されない配布は、セキュリティ・モジュールによって開始され、完全に定義されていないポリシーを取得することがあります。ポリシー・ストアは、オンラインで、制御されない配布に対して常に使用可能である必要があります。制御されない配布は、どのポリシー・ストア・タイプでもサポートされます。

4.3 セキュリティ・モジュールの構成とバインディング

セキュリティ・モジュールはポリシー決定ポイント(PDP)として動作し、認可のリクエストを受信し、適用できるポリシーに基づいて評価して決定し、その決定をポリシー決定ポイント(PEP)である、最初に認可コールを作成したエンティティに返します。このプロセスが機能するには、セキュリティ・モジュールが適切なポリシーを取得できる必要があります。これは、セキュリティ・モジュールのインスタンスを適切なApplicationPolicyオブジェクトにバインディングすることで実現できます。ポリシー配布の開始時、ApplicationPolicyオブジェクトにバインディングされたすべてのセキュリティ・モジュールに、そのオブジェクトに関連付けられたポリシー・データが配布されます。デプロイされたセキュリティ・モジュールごとに構成情報があり、ポリシー・ストアに保存されます。SMEntryオブジェクトは、インスタンスの構成情報へのポインタです。

注意:

セキュリティ・モジュールの開始時に、それ自体をOracle Entitlements Serverに登録します。この登録レコードは、ポリシー・ストアにPDPInfoEntryオブジェクトとして追加されます。登録レコードには、セキュリティ・モジュールのエンドポイントと、命名された固有の識別子があります。PDPInfoEntryインタフェースは、oracle.security.jps.service.policystore.info.distributionパッケージ内にあります。このパッケージには、配布のステータス(DistributionStatusEntry)に関する情報と、特定のセキュリティ・モジュールへの配布のステータス(PDPStatusEntry)に関する情報を取得するために使用するインタフェースも含まれています。

セキュリティ・モジュールをApplicationPolicyオブジェクトにバインドするには、SMEntryオブジェクト(セキュリティ・モジュールの構成を表します)を作成し、ApplicationPolicyオブジェクトにバインドします。例4-1は、PolicyStoreのインスタンスを取得して、ConfigurationManagerを取得することによりSMEntryオブジェクトを作成する方法を示しています。これは、1つ以上のApplicationPolicyオブジェクトをバインディングするために使用できる、SMEntryオブジェクトを返します。

例4-1 createSecurityModule()メソッドの使用方法

//get the policy store and configuration manager
PolicyStore ps = ctx.getServiceInstance(PolicyStore.class);
ConfigurationManager configMgr = ps.getConfigurationManager();

//create the SM configuration
SMEntry sm = configMgr.createSecurityModule("MyDomainSM",
"MyDomainSM Configuration", "MyDomain Security Module Configuration");

createSecurityModule()パラメータの値は次のように定義されています。

- smName - MyDomainSMはSMEntryオブジェクトの固有の識別子です。セキュリティ・モジュールは、この値を使用してポリシー・ストアに接続し、構成情報を取得します。SMEntryオブジェクト自体には、構成情報は含まれておらず、単純にポイントしているだけです。

- 表示名 - MyDomainSM ConfigurationはSMEntryオブジェクトのオプションの判読可能名です。

- 説明 - MyDomain Security Module Configurationは、SMEntryオブジェクトについて説明するオプションの情報です。

作成後、ConfigurationBindingManagerインタフェースをコールし、bindSecurityModule()メソッドを使用して、SMEntryオブジェクトを特定のApplicationPolicyオブジェクトにバインドします。例4-2に、この手順を示します。

例4-2 bindSecurityModule()メソッドの使用方法

//get the policy store and the configuration binding manager
PolicyStore ps = ctx.getServiceInstance(PolicyStore.class);
ConfigurationBindingManager configBindingMgr =
ps.getConfigurationBindingManager();

//bind Security Module to Application Policy
configBindingMgr.bindSecurityModule("MyDomainSM", "MyAppPolicy");

bindSecurityModule()パラメータの値は次のように定義されています。

- smName - MyDomainSMはSMEntryオブジェクトが作成されたときに定義された固有の識別子です。

- AppID - MyAppPolicyはApplicationPolicyオブジェクトが作成されたときに定義された固有の識別子です。

次の各項では、セキュリティ・モジュールの構成とバインディングについて説明します。

- 4.3.1項「セキュリティ・モジュールの構成の管理」

- 4.3.2項「セキュリティ・モジュール・バインディングの管理」

4.3.1 セキュリティ・モジュールの構成の管理

ConfigurationManagerのインスタンスを取得したら、SMEntryオブジェクトを削除、変更および取得することもできます。例4-3は、SMEntryオブジェクトの固有識別子を渡すことによって、特定のセキュリティ・モジュールの構成を取得する方法を示しています。

例4-3 getSecurityModule()メソッドの使用方法

//get the policy store and configuration manager
PolicyStore ps = ctx.getServiceInstance(PolicyStore.class);
ConfigurationManager configMgr = ps.getConfigurationManager();

//get Security Module configuration
SMEntry sm = configMgr.getSecurityModule("MyDomainSM");

MyDomainSMはSMEntryオブジェクトが作成されたときに定義された固有の識別子です。さらに、getSecurityModules()メソッドをコールし、SecurityModuleSearchQueryクラスを使用して検索条件の配列を渡すことで複数のSMEntryオブジェクトを取得できます。例4-4は、セキュリティ・モジュールの構成を削除する方法を示しています。

例4-4 deleteSecurityModule()メソッドの使用方法

//get the policy store and configuration manager
PolicyStore ps = ctx.getServiceInstance(PolicyStore.class);
ConfigurationManager configMgr = ps.getConfigurationManager();

//get Security Module configuration
configMgr.deleteSecurityModule("MyDomainSM");

この場合も、MyDomainSMはSMEntryオブジェクトが作成されたときに定義された固有の識別子です。

4.3.2 セキュリティ・モジュール・バインディングの管理

ConfigurationBindingManagerインスタンスを取得したら、特定のセキュリティ・モジュールにバインドされているApplicationPolicyを取得するか、特定のApplicationPolicyにバインドされているセキュリティ・モジュールを取得することもできます。例4-5は、特定のApplicationPolicyオブジェクトにバインドされているすべてのSMEntryオブジェクトの識別子を取得するgetBoundSecurityModules()メソッドの使用方法について示しています。

例4-5 getBoundSecurityModules()メソッドの使用方法

//get the policy store and the configuration binding manager
PolicyStore ps = ctx.getServiceInstance(PolicyStore.class);
ConfigurationBindingManager configBindingMgr =
ps.getConfigurationBindingManager();

//get Security Module bound to Application Policy
List<SMEntry> sms = configBindingMgr.getBoundSecurityModules("MyAppPolicy");

MyAppPolicyはApplicationPolicyオブジェクトが作成されたときに定義された固有の識別子です。getBoundSecurityModules()メソッドは、ApplicationPolicyオブジェクトにバインドされているすべてのSMEntryオブジェクトの固有の識別子のリストを返します。例4-6は、逆の操作を示しており、特定のセキュリティ・モジュールにバインドされたすべてのApplicationPolicyオブジェクトを取得します。

例4-6 getBoundApplications()メソッドの使用方法

//get the policy store and the configuration binding manager
PolicyStore ps = ctx.getServiceInstance(PolicyStore.class);
ConfigurationBindingManager configBindingMgr =
ps.getConfigurationBindingManager();

//get Application Policy bound to Security Module
List<ApplicationPolicy> apps =
configBindingMgr.getBoundApplications("MyDomainSM");

MyDomainSMはSMEntryオブジェクトが作成されたときに定義された固有の識別子です。getBoundApplications()メソッドは、SMEntryにバインドされているApplicationPolicyオブジェクトすべての固有の識別子のリストを返します。例4-7は、SMEntryオブジェクトと対応するApplicationPolicyオブジェクトとのバインドを解除する方法を示しています。

例4-7 unbindSM()メソッドの使用方法

//get the policy store and the configuration binding manager
PolicyStore ps = ctx.getServiceInstance(PolicyStore.class);
ConfigurationBindingManager configBindingMgr =
ps.getConfigurationBindingManager();

//unbind Application Policy from Security Module
configBindingMgr.unbindSM("MyDomainSM", "MyAppPolicy");

MyDomainSMはSMEntryオブジェクトが作成されたときに定義された固有の識別子です。MyAppPolicyはApplicationPolicyオブジェクトが作成されたときに定義された固有の識別子です。

4.4 ポリシー配布の開始

プログラムにより、distributePolicy()メソッドをコールすることによってポリシーの配布が開始されます。このメソッドは、ApplicationPolicyオブジェクトに対して作成されたポリシーを、バインドされたセキュリティ・モジュールに配布します。PDPエンドポイントは、バインドされたポリシーのみを受信します。例4-8は、PolicyDistributionManagerのコール方法とdistributePolicy()メソッドの使用方法を示しています。さらに、配布のステータスを確認するコードと、処理が100%完了するまで待機するコードを含んでいます。

例4-8 distributePolicy()メソッドの使用方法

//get the application policy
PolicyStore ps = ctx.getServiceInstance(PolicyStore.class);
ApplicationPolicy bankApplication =
ps.getApplicationPolicy("AcmeBank");

//get the PolicyDistributionManager
PolicyDistributionManager pdm =
bankApplication.getPolicyDistributionManager();

//distribute policies
String distID = pdm.distributePolicy(true);

DistributionStatusEntry status = pd.getDistributionStatus(distID);

while (status.getPercentComplete() != 100) {
Thread.currentThread().sleep(200);
status = pdm.getDistributionStatus(distID);
}

distributePolicy()のflushパラメータはtrueに設定することに注意してください。これは、ポリシーがフラッシュ方式で配布されることを示しています。つまり、ポリシー・ストア内のすべてのポリシー・オブジェクトを新たに完全に再配布するための準備として、ローカルに保存されたポリシーをクリーンアップするよう、ポリシー配布コンポーネントがセキュリティ・モジュールに通知します。falseの値は、差分のみが配布されるポリシーの増分配布を示します。

distributePolicy()メソッドは、配布の識別子の文字列を返します。これをgetDistributionStatus()メソッドを使用してアプリケーションに渡すことで、配布の進行状況を問い合せることができます。

注意:

distributePolicy()は、非同期メソッドです。配布が完了する前にアプリケーションが停止した場合は、配布プロセスが中断します。

2番目のgetDistributionStatus()メソッドは、入力に開始時刻と終了時刻を取ります。DistributionStatusEntryオブジェクトのリストを返します。DistributionStatusEntryオブジェクトは配布のステータス(完了または実行中)を表し、PDPごとに開始時刻、終了時刻、配布の開始者および配布が成功したかどうかの情報を含んでいます。

5 ポリシー管理の委任

システム管理権限およびポリシー管理権限を、ある管理者から別の管理者に委任するには、制限付きの権限を持つ管理ロールを作成するか、既存の管理ロールをユーザーに付与します。管理の委任は、サブジェクト(ロールが付与される人)、リソース(ロールが関連するオブジェクト)およびロールが制御(表示、管理)するリソースへのアクションの定義で構成されます。この章では、ポリシーおよびシステム管理タスクを委任する方法について説明します。この章には次の項目があります。

- 5.1項「管理の委任」

- 5.2項「範囲と委任の粒度の管理」

- 5.3項「権限の割当て」

- 5.4項「デフォルトの管理ロールの使用方法」

- 5.5項「管理ロールの作成」

- 5.6項「管理ロールの管理」

- 5.7項「ポリシー・ドメインの委任」

5.1 管理の委任

管理とは、ある作業を行うユーザーに1つ以上の認可された権限が付与される場合を指します。委任とは、そのユーザーが自分に付与された権限を別のユーザーに引き渡す機能です。これらを組み合せて、管理の委任を、あるユーザーから別のユーザーへの認可された権限の移行として定義できます。Oracle Entitlements Serverでは、ポリシー・オブジェクトおよびエンティティでのタスクを実行する資格を持つ管理者は、この権限を他の人に譲渡できます。

Oracle Entitlements Serverでの委任された管理は、ロールベース・アクセス制御(RBAC)のアプローチを使用してモデル化されます。ユーザーは、このアプローチによって、アプリケーション、ポリシー・ドメインおよびその他のロールを使用するポリシー・オブジェクトへ管理を譲渡できます。RBACの中核となる概念は、権限(アクションを実行する許可)と、アクションを実行可能な権限としてモデル化できるオブジェクトを組み合せることです。次に、これらの権限をロールに割り当てます。ユーザーをロールに割り当てると、そのユーザーに適切な権限が付与されます。

図5-1 管理ロール・モデル

「図5-1 管理ロール・モデル」の説明

図5-1のとおり、管理ロールはポリシー関連の特定の操作に対して作成されます。ジョブ専用の操作を実行する権限は、そのロールで定義されます。ユーザーは、ロールに割り当てられ、その割当ての間にジョブを実行する権限を取得します。ユーザーは直接権限に割り当てられないため、個々のユーザー権限の管理は、適切なロールを適切なユーザーに割り当てることになります。管理ロールは、ポリシー・オブジェクトの管理が可能なユーザーを決定するために使用します。

5.2 範囲と委任の粒度の管理

委任管理は、リソースおよびポリシー・オブジェクトの管理をある人から別の人に譲渡することに関するすべてです。委任の範囲(または委任によって適用されるオブジェクトの範囲)は、レベルで定義されます。管理の粒度は、各範囲で管理されるオブジェクトのタイプを定義します。各範囲が作成されると、デフォルトの管理ロールが自動的に作成されます。追加の管理ロールは後で作成できます。最高から最低まで、範囲および適用可能な粒度は、次のとおりです。

- 最高レベルのシステム管理者には、システムレベルのリソースおよび最上位のポリシー・ストア範囲でポリシー関連オブジェクトを管理する権限があります。システム・リソースには、管理者ロールとシステム構成およびバインディングが含まれます。ポリシー・ストア・レベルのオブジェクトはApplicationPolicyオブジェクトとグローバル・オブジェクトです。

注意:

システム管理者は、すべてのApplicationPolicyオブジェクトおよび子のPolicyDomainオブジェクトを含む、ポリシー・ストア全体に対する権限を持っていますが、構成、ApplicationPolicyオブジェクトおよび2つの間のバインディングを管理することを主な目的としています。

- アプリケーション・ポリシーの管理者は、割当て先のApplicationPolicyオブジェクト内のすべてのオブジェクトを管理する権限を持っています。作成されたアプリケーション・ポリシーごとに、アプリケーション・ポリシー管理者が1つ作成されます。これらは、ポリシー・ドメイン・オブジェクトおよびその子(関数、属性、アプリケーション・ロール、リソース・タイプなど)を含む、アプリケーション・ポリシー内のポリシー・オブジェクトの管理を委任することを主な目的としています。

- ポリシー・ドメイン管理者は、割当て先のポリシー・ドメイン・オブジェクト内のすべての子オブジェクトを管理する権限を持っています。作成される各ポリシー・ドメインに、1つのポリシー・ドメイン管理者が生成されます。これらは、主に、該当するポリシー・ドメイン内にポリシー、権限セットおよびリソースを定義することを目的としています。

注意:

ApplicationPolicyオブジェクトの詳細は、第1章「ポリシー・モデルの使用方法」を参照してください。PolicyDomainオブジェクトの詳細は、5.7項「ポリシー・ドメインによる委任」を参照してください。

5.3 権限の割当て

管理者ロールは、管理および表示アクションを持つ権限を割り当てることができます。これらのアクションの権限は次のとおりです。

- 管理権限を持つ管理者ロールは、割り当てられた管理範囲内のオブジェクト(子のオブジェクトを含む)ですべてのメソッドをコールできます。たとえば、管理権限を持つアプリケーション・ポリシー管理者は、アプリケーション・ポリシーとそのポリシー・ドメイン・オブジェクトの両方のオブジェクトで、すべてのメソッドをコールできます。管理権限を持つ管理者は、親の範囲にある必要なオブジェクトを表示することもできます。たとえば、ポリシー・ドメインの管理権限を持つ管理者は、親のアプリケーション・ポリシーにあるすべてのリソース・タイプ、関数および属性を参照できます。これは、ポリシーの定義の際にこれらのオブジェクトを使用するためです。

- 表示権限を持つ管理者は、割り当てられた管理範囲内のオブジェクト(子のオブジェクトを含む)で、getメソッドのみをコールできます。たとえば、表示権限を持つグローバル管理者は、アプリケーション・ポリシーとそのポリシー・ドメイン・オブジェクトの両方で、すべてのオブジェクトを表示できます。

5.4 デフォルトの管理ロールの使用方法

インストール後、ポリシー・ストアには、ポリシー・ストア・レベルでの完全な表示および管理権限を持つSystemAdminというデフォルトの管理ロールが含まれています。この管理ロールとその他のデフォルトの管理ロールを次のリストで説明します。これらのデフォルトの管理ロールのメンバーのみが、他の管理ロールを作成および管理できます。デフォルトの管理ロールは、削除したり、権限を変更することはできません。

- SystemAdmin — これは、デフォルトのポリシー・ストア管理者でポリシー・ストア全体の管理権限を持ちます。このロールは、WebLogic Server Administratorsグループに割り当てられ、すべてのアプリケーション・ポリシー・オブジェクトおよびポリシー・ドメイン・オブジェクトでポリシーを管理するために必要な権限を持ちます。

- ApplicationPolicyAdmin — この名前のロールは、新規のアプリケーション・ポリシー・オブジェクトごとに自動的に作成されます。アプリケーション・ポリシーとネストされたポリシー・ドメイン・オブジェクトでの管理権限を持ちます。

- PolicyDomainAdmin — この名前のロールは、新規のポリシー・ドメイン・オブジェクトごとに自動的に作成されます。ポリシー・ドメインとネストされたポリシー・ドメイン・オブジェクトでの管理権限を持ちます。また、親のアプリケーション・ポリシー内のオブジェクトに対する表示権限を持ちます。

5.5 管理ロールの作成

管理ロールは、システム管理権限を委任するために使用します。管理ロールは、異なる範囲でデータを管理する目的で作成できます。たとえば、管理者ロールを適切なレベルで作成し、ユーザーまたはグループにこのロールを割り当てることによって、アプリケーション・ポリシーおよびポリシー・ドメインの管理者を定義できます。

注意:

管理者ロールは、システム管理権限を範囲指定によって委任し、階層構造を持ちません。詳細は、5.2項「範囲と委任の粒度の管理」を参照してください。

管理ロールの作成には、いくつかの手順があります。特定の管理リソースに表示または管理権限を付与するには、次の詳細な手順を使用します。

1. 5.5.1項「管理ロールの作成」の説明に従って、管理ロールを作成するオブジェクトと、AdminManagerのインスタンスを取得します。

2. 5.5.2項「管理ロールへのアクションとリソース(権限)の割当て」の説明に従って、リソースと適切なアクションを定義します。

3. 5.5.3項「管理ロールへのプリンシパルの割当て」の説明に従って、ユーザー(プリンシパル)を割り当てます。

5.5.4項「プリンシパルの管理リソースの取得」では、プリンシパルを割り当て済の管理ロールを取得する方法について説明しています。

5.5.1 管理ロールの作成

管理ロールを作成するには、目的の管理範囲(ポリシー・ストア、管理ポリシーまたはポリシー・ドメイン)を包含するオブジェクトを取得し、getAdminManager()メソッドを使用してAdminManagerのインスタンスを取得し、さらにcreateAdminRole()メソッドを使用してadminRoleロールを作成します。次のコードは、TRADINGアプリケーション・ポリシーに対してAppAdminという名前の管理者を作成しています。

//Get the Application Policy and AdminManager
ApplicationPolicy app = ps.getApplicationPolicy(“TRADING”);
AdminManager appAdminManager = app.getAdminManager();
AdminRoleEntry adminRole = appAdminManager.createAdminRole
(“AppAdmin", "AppAdmin Role", "Role for application admins.");

createAdminRole()パラメータの値は次のように定義されています。

- 名前 - AppAdminは管理ロールの名前です。

- 表示名 - AppAdmin Roleは管理ロールのオプションの判読可能名です。

- 説明 - Role for application admins.は管理ロールのオプションの説明です。

5.5.2 管理ロールへのアクションとリソース(権限)の割当て

権限は、リソースを管理するArrayListを作成することで管理ロールへ割り当てて、許可されたアクションを追加します(BasicAdminResourceActionEntryを使用)。次のコードでは、前に作成したAppAdminロールに、TRADINGアプリケーションのリソース・タイプとアプリケーション・ロールの管理権限を割り当てています。

//Construct the permission to be granted
List<AdminResourceActionEntry> adminResourceActions = new ArrayList
<AdminResourceActionEntry>();

//Add operations (Manage) and objects (resources) to the permission
adminResourceActions.add(new BasicAdminResourceActionEntry
(AdminResource.RESOURCE_TYPE, Action.MANAGE));
adminResourceActions.add(new BasicAdminResourceActionEntry
(AdminResource.APPLICATION_ROLE, Action.MANAGE));

//Grant AppAdmin the rights
admManager.grant(adminRole, adminResourceActions);

権限をロールから削除するには、grant()メソッドではなくrevoke()メソッドを使用します。表5-1で、ポリシー・ストア、アプリケーション・ポリシーおよびポリシー・ドメインに対して許可されたリソース名のオプションを説明します。

表5-1 リソース名のオプション

名前

説明

ADMIN_POLICY

管理ポリシーを管理できます。

ADMIN_ROLE

管理ロールのメンバーシップと権限を管理できます。

APPLICATION_ POLICY

アプリケーション・ポリシー・オブジェクトを管理できます。

APPLICATION_ ROLE

アプリケーション・ロールを管理できます。

CONFIGURATION

セキュリティ・モジュールを管理できます。

DISTRIBUTE_ APPLICATION_ POLICY

管理者にポリシー配布の開始を許可します。

ENROLL

管理者にセキュリティ・モジュール・インスタンスの登録を許可します。

EXTENSION

関数と属性の管理を許可します。

PERMISSION_SET

権限セットを管理できます。

POLICY

ポリシーを管理できます。

RESOURCE_TYPE

リソース・タイプを管理できます。

RESOURCE

リソースを管理できます。

ROLE_CATEGORY

ロール・カテゴリを管理できます。

SUB_POLICY_DOMAIN

ポリシー・ドメイン・オブジェクトを管理できます。

5.5.3 管理ロールへのプリンシパルの割当て

アプリケーション・ロールに1つ以上のプリンシパルを割り当てるには、2番目のArrayListを該当するユーザー・エントリによって作成し、リストをgrantAdminRole()メソッドへ渡します。次のコードでは、前に作成したadminRoleロールをユーザーのSMITHに付与しています。

//Construct the list of users to be granted
List<PrincipalEntry> principals = new ArrayList<PrincipalEntry>();
principals.add(new BasicPrincipalEntry
("weblogic.security.principal.WLSUserImpl", "SMITH"));

//Grant the users in the list the role
adminManager.grantAdminRole(adminRole, principals);

プリンシパルをロールから削除するには、revokeAdminRole()メソッドを使用します。

5.5.4 プリンシパルの管理リソースの取得

管理ユーザーがアクセス可能なリソースを指定するには、該当する範囲(ポリシー・ストア、アプリケーション・ポリシーまたはポリシー・ドメイン)でAdminManagerのインスタンスを取得し、getAdminRole()メソッドと管理ロールの名前を使用して管理者を取得します。次にgetGrantedAdminResources()メソッドを呼び出すことで、管理者に適用可能なすべてのAdminResourceActionEntryオブジェクトが返されます。(AdminResourceActionEntryオブジェクトは、管理者が管理可能なエンティティと、そのエンティティに実行可能なアクションをペアにします。)

5.6 管理者ロールの管理

5.5項「管理ロールの作成」では、AdminRoleEntryオブジェクトの作成方法について説明しました。管理ロールは、目的の範囲内からAdminManagerのインスタンスを取得することにより、すべての範囲レベル(PolicyStore、ApplicationPolicyおよびPolicyDomainを含む)で作成できます。また、AdminManagerのインスタンスを取得することで、これらの任意の範囲からAdminRoleEntryオブジェクトを削除および取得できます。例5-1は、ApplicationPolicyのAdminManagerを取得することによる削除のアクションを示しています。

例5-1 deleteAdminRole()メソッドの使用方法

//Get the Application Policy and AdminManager
ApplicationPolicy app = ps.getApplicationPolicy(“TRADING”);
AdminManager appAdminManager = app.getAdminManager();

//delete the Administration Role
AdminRoleEntry adminRole = appAdminManager.deleteAdminRole
(“AppAdmin");

TRADINGは、AdminRoleEntryが作成されたApplicationPolicyの名前です。AppAdminは、削除するロールの固有の識別子です。

getAdminRole()メソッドはAdminRoleEntryを取得するために使用でき、名前によって取得することもできます。例5-2に、これを示します。

例5-2 getAdminRole()メソッドの使用方法

//Get the Application Policy and AdminManager
ApplicationPolicy app = ps.getApplicationPolicy(“TRADING”);
AdminManager appAdminManager = app.getAdminManager();

//Get the Administration Role
AdminRoleEntry adminRole = appAdminManager.getAdminRole
(“AppAdmin");

getAdminRoles()メソッドをコールし、ResourceTypeSearchQueryクラスを使用して検索条件を渡すことで多数のAdminRoleEntryオブジェクトを取得できます。さらに、AdminManagerインタフェースには、次の操作を行うためのメソッドがあります。

- PrincipalEntryオブジェクトを管理ロール・メンバーとして追加または削除

- 名前付き管理ロールを付与されたPrincipalEntryオブジェクトのリストを返す

- 名前付き管理ロールへのアクションおよびリソース(AdminResourceActionEntry)の付与または取消

- 現在の管理者に定義されたアクションとリソース(AdminResourceActionEntry)の取得

- 管理ロールの変更

5.7 ポリシー・ドメインの委任

ポリシー・ドメインには、完了したポリシー定義のコンポーネントが含まれます。これは、ターゲット・リソース(リソース・タイプのインスタンス)、権限セット(リソースで実行できるアクション)、およびポリシー(コントロールをアセンブルするルールおよび影響を及ぼすプリンシパル)を合せたものです。ポリシー・ドメインは、管理を委任する目的で作成します。このドメインを1つ(以上)作成することで、ポリシー管理を別の管理者に委任できます。

注意:

ポリシー・ドメインの作成はオプションであるため、リソース、権限セットおよびポリシーを作成可能なデフォルトのポリシー・ドメインとしてApplicationPolicyオブジェクトを指定できます。以降のポリシー・ドメインは、組織の委任に関する計画に従って作成します。

1つ以上のポリシー・ドメインを使用して、保護されたアプリケーションを保護しているポリシーの管理を委任できます。複数のポリシー・ドメインを使用することによって、保護されたアプリケーションのアーキテクチャや、ポリシーの管理の委任方法など、定義されたロジックに従ってポリシーをパーティション化できます。たとえば、1つのポリシー・ドメインを使用して、すべてのポリシーのリソース保護を維持することも、複数のポリシー・ドメインを使用して、リソースの特定の特性を反映することもできます。異なるポリシー・ドメインを担当する別の管理者を配置することができます。ポリシー管理を委任する必要がない場合には、ポリシー・ドメインを作成する必要はありません。この場合、ポリシー・ドメインに関連付けられたすべての子のオブジェクトは、ApplicationPolicyインタフェースを使用して該当する子のオブジェクト・マネージャをコールすることで作成できます。

ポリシー・ドメインは、プログラミングではPolicyDomainEntryオブジェクトとして表現されます。ApplicationPolicyオブジェクト内で、1つ以上の(オプションの)PolicyDomainEntryオブジェを作成できます。PolicyDomainEntryオブジェクトには、1つ以上の子オブジェクトを含めることができます。これらのオブジェクトはポリシー・ドメインを作成する前に定義する必要があります。

注意:

PolicyDomainEntryオブジェクトを削除すると、その中に作成されたすべての子オブジェクトも削除されます。

PolicyDomainEntryオブジェクトを作成するには、getPolicyDomainManager()メソッドを使用して、PolicyDomainManagerのインスタンスを取得します。(ネストしたポリシー・ドメインを作成するには、ApplicationPolicyまたはPolicyDomainEntry自体に対してgetPolicyDomainManager()を呼び出します。)PolicyDomainManagerインタフェースのcreatePolicyDomain()メソッドを使用してオブジェクトを作成します。例5-3は、Trading ApplicationPolicyからPolicyDomainManagerを取得することで、East_Tradingという名前のPolicyDomainEntryオブジェクトを作成しています。

例5-2 createPolicyDomain()メソッドの使用方法

PolicyDomainManager domainMgr = Trading.getPolicyDomainManager();
PolicyDomainEntry domain = domainMgr.createPolicyDomain
("East_Trading", "East_Trading Domain", "East_Trading Domain");

createPolicyDomain()パラメータの値は次のように定義されています。

- 名前 - East_TradingはPolicyDomainEntryオブジェクトの固有の識別子です。

- 表示名 - East_Trading DomainはPolicyDomainEntryオブジェクトのオプションの判読可能名です。

- 説明 - East_Trading Domainは、PolicyDomainEntryオブジェクトについて説明するオプションの情報です。

PolicyDomainEntryオブジェクトを作成したら、必要な子のオブジェクトを追加できるようになり、管理者はポリシー定義コンポーネントの制御が可能になります。次のリストは、PolicyDomainEntryの子のオブジェクトについて説明し、第2章「ポリシーのプログラムによる作成」の該当する説明の項へのリンクを示しています。

- PermissionSetEntryオブジェクト(特定のリソースに実行可能なアクションを関連付ける1つ以上のResourceActionsEntryオブジェクト)。詳細は、2.4.4「権限セットの定義」を参照してください。

- PolicyEntry(PolicyRuleEntryを1つ、PermissionSetEntryを1つ、PrincipalEntryまたはAppRoleEntryを1つ、およびオプションでObligationEntryを1つ含みます)。詳細は、2.3.8項「ポリシーの定義」を参照してください。

- AdminRoleEntry (ドメインの管理を定義します)。詳細は、2.3.4項「リソースのインスタンス化」を参照してください。

注意:

同じターゲット・リソースをポリシー・ドメイン間で共有することはできません。

6 認可コールと決定の処理

Oracle Entitlements Serverには、コール元が特定のサブジェクトについて認可をリクエストし、返された決定を処理可能な、様々なアプリケーション・プログラミング・インタフェース(API)があります。この章の内容は次のとおりです。

- PEP APIの使用方法

- checkPermission()コールの実行

- XACMLゲートウェイの使用方法

6.1 PEP APIの使用方法

AzAPIは、OpenAZプロジェクトで開発されたJava APIであり、認可の決定のリクエストと通信し、同じ相手にレスポンスするように設計されています。通信は、XACML使用に定義された認可決定のリクエストおよびレスポンスの標準に基づきます。さらに、通信では、認証エンジンがこれらの定義を使用してリクエストとレスポンスを作成する必要があります。AzAPIインタフェースは、ポリシー定義ポイント(PDP)でのすべてのXACML情報の提供と消費を可能にします。この情報は、認可リクエストを送信するとき、および認可レスポンスを受信するときに必要になります。

注意:

OpenAZプロジェクトの詳細は、http://openliberty.org/で説明されています。

Oracle Entitlements Server PEP APIは、Javaおよび.NETアプリケーションのいずれかを保護するために、AzAPIの最上位に作成します。PEP APIには、ポリシー決定ポイント(PEP)を作成するユーティリティ・クラスがあり、XACMLデータ・オブジェクトではなくネイティブのJavaまたは.NETデータ・オブジェクトを使用してAzAPIよりも簡単で拡張性のあるインタフェースを提供するように設計されています。図6-1は、AzAPI、PEP APIおよびOracle Entitlements Server間の関係を示しています。

図6-1 はオープンAZ APIおよびPEP API間の関係

「図6-1 オープンAZ APIおよびPEP API間の関係」の説明

次の項では、Oracle Entitlements ServerによってAzAPIを実装する方法を説明します。

- 6.1.1項「PEP APIについて」

- 6.1.2項「Java用PEP APIの使用方法」

- 6.1.3項「.NET用PEP APIの使用方法」

6.1.1 PEP APIについて

Oracle Entitlements Serverでは、org.openliberty.openaz.azapi.pepパッケージのJavaおよび.NETプロバイダ実装を提供しています。Java PEP APIプロバイダは、oracle.security.jps.openaz.pepでパッケージ化されています。.NETプロバイダ・インタフェースはOes.Pep.Apiネームスペースで実装されています。

注意:

PEP APIは、プロキシ実装を通じてWebサービス・セキュリティ・モジュールをコールします。このプロキシ・レイヤーはフェイルオーバーとキャッシュを処理します。Oracle Entitlements Server Web Serviceセキュリティ・モジュールのインストールの詳細は、Oracle Fusion Middleware Oracle Identity Managementインストレーション・ガイドを参照してください。

次の各項では、詳細を説明します。

- 6.1.1.1項「PEP APIの使用」

- 6.1.1.2項「様々なPEP APIリクエストの使用方法」

- 6.1.1.3項「PEP APIサブジェクトの指定」

- 6.1.1.4項「認可リクエスト文字列の書式」

- 6.1.1.5項「問合せを使用した認証情報の取得」

6.1.1.1 PEP APIの使用

PEP API認可リクエストごとに、プロバイダ実装はOracle Entitlements Server認可エンジンを呼び出し、決定を返します。この実装は、ネイティブJavaまたは.NETオブジェクト(サブジェクト、リソース、アクションなど)の変換と、基礎となるセキュリティ・プラットフォームへのマッピングを処理する必要があります。プロバイダ実装は、決定時に認可を取得する次のアクションを実行します。このシーケンスは、指定されたターゲットにポリシーが定義済であると仮定しています。リクエストとレスポンスには、PDPと相互作用するための標準の書式があります。

1. アクセスのリクエストはPEPで受信されます。
リクエストには、サブジェクト、リソース、アクションおよび(オプションの)環境属性が含まれています。サブジェクトが保護されたリソースへアクセスするのを認可するためにコールできます。また、アクションや認可の決定について何が許可されるかを問い合せることができます。

2. PEPはPEP APIをコールし、PEP APIは、認可のリクエストを(アクセスしているリソースのタイプに基づいて)ポリシー決定ポイント(PDP)に渡します。
PEP APIは、認可リクエストのタイプをリソース・タイプに基づいて決定します。

3. PDPは、該当する場合に、追加のサブジェクト、アクション、環境などの属性をリクエストします。
属性は、ポリシー情報ポイント(PIP)からリクエストされます。PIPはリクエストされた属性を返し、情報がPDPに戻されます。

4. PDPは、関連するポリシーに対してリクエストを評価します。

5. PDPは(認可の決定を含む)レスポンスをPEPに返します。
レスポンスは、1つ以上の結果で構成されます。(結果が複数になるのは、階層型リソースを評価した場合のみです。)結果にはそれぞれ、決定(許可、拒否)、ステータス情報(評価に失敗した理由など)および(オプションで)1つ以上の義務が含まれています(PEPには、アクセスを付与または拒否する前に、これらを処理する義務があります)。

6. PEPは義務がある場合には遂行します。

7. PEPは、リクエストが付与された場合に、リソースへのアクセスを許可し、そうでない場合にはアクセスを拒否します。

6.1.1.2 様々なPEP APIリクエストの使用方法

PEP APIを使用することで、様々な方法でアクセスの認可をリクエストできます。1つのサブジェクトまたは複数のサブジェクトをそれぞれ単一の認可コールまたは一括認可コールで認可できます。Oracle Entitlements Serverでは、認可の決定とアクションに関する問合せもサポートされています。表6-1「PEP API認可リクエスト・タイプについて」で、これらのリクエスト・タイプの詳細を説明します。

表6-1 PEP API認可リクエスト・タイプについて

認可リクエスト・タイプ

入力パラメータ

戻り値

単一の認可リクエスト

(権限を使用する場合にのみサポートされます)

- サブジェクトを表すオブジェクトまたは文字列

- リソース/アクションのペアまたは単独のリソースおよびアクションを表すオブジェクト

- 環境のコンテキストを表すオブジェクト(オプション)

- 単一のリクエストに対して、レスポンス・オブジェクトと認可の決定および義務(オプション)を返します。

- 例外をスローします。

一括認可リクエスト

- 1つのサブジェクトを表すオブジェクトまたは文字列

- 複数のリソース/アクションのペア、または1つのリソースを表すリスト1つと1つのアクションを表すリスト1つ

- 環境のコンテキストを表すオブジェクト

- 単一コールでの複数のリクエストに対して、複数の認可の決定を持つレスポンス・オブジェクトと義務(オプション)を返します。

- 例外をスローします。

問合せは、指定されたリソース/アクション/サブジェクト/環境の関係に対する認可の決定のリストを返します。

- 特定のタイプのすべてのリソースまたは、特定のリソースのすべての子の付与および拒否された決定を取得できます。

- 許可の問合せによって、許可されたリソース・アクションの関係のリストが返されます。

- 拒否の問合せによって、拒否されたリソース・アクションの関係のリストが返されます。

- 詳細の問合せによって、各リソース・アクションの関係に対する認可の決定の全結果が返されます。

- サブジェクトを表すオブジェクトまたは文字列

- リソース/アクションのペアまたは単独のリソースおよびアクションを表すオブジェクト

- 環境のコンテキストを表すオブジェクト

- 認可情報が特定のリソースまたは特定のリソースと子に必要かどうかを指定する検索範囲(問合せリクエストAPIが1つの場合)

- 宣言されたリソース/アクションのペアと同じ順序の認可の決定を含んだ結果のリストを返します。

- 定義された検索範囲に応じて、特定のリソース、特定のタイプのすべてのリソースまたは特定のリソースのすべての子の認可の決定を返します。

- 例外をスローします。

6.1.1.3 PEP APIサブジェクトの指定

保護されたリソースへのアクセスの認可をリクエストするサブジェクトは、文字列か、現在認証されているユーザーを表すオブジェクトを渡すことで定義できます。

- アイデンティティ・ストアに定義されているサブジェクトの名前の値を表す文字列を渡すことができます(例、Josh Smith)

- Javaまたは.NETオブジェクト(認可されたユーザーを表します)を渡すことができます。

詳細は、6.1.2.1項「Java PEP APIサブジェクトの取得」または6.1.3.1項「.NET PEP APIサブジェクトの取得」を参照してください。

6.1.1.4 認可リクエスト文字列の書式

PEP APIメソッドは、リクエストの範囲を定義する文字列を含みます。この範囲の文字列にリソース文字列を定義します。次の各項では、これらの範囲およびリソース文字列の書式設定方法を説明します。

- 6.1.1.4.1項「PEP APIの範囲文字列の書式」

- 6.1.1.4.2項「PEP APIのリソース文字列の書式」

6.1.1.4.1 PEP APIの範囲文字列の書式

範囲の入力文字列は、リソース、アクションおよび検索の範囲情報がカプセル化された、PDPポリシー専用のリソース表現です。これは次のように表現されます。

String scope = "resource = resourceString,actions = actionString1,
actionString2, actionString3, searchscope = immediate/children";

この表現には次の規則があります。

- resourceは必須で、resource文字列を範囲文字列内の最初に記述する必要があります。6.1.1.4.2項「PEP APIのリソース文字列の書式」を参照してください。

- actionsはオプションです。存在する場合は、リクエストされたアクションのカンマ区切りリストを含み、必ず範囲の前に記述します。

- searchscopeはオプションで、問合せリクエスト・タイプのみで使用します。値に、children(デフォルト値)またはimmediateを取ります。

- 6.1.1.4.2項「PEP APIのリソース文字列の書式」の説明のとおり、値がchildrenの場合、resourceStringに渡せるのはアプリケーション識別子のみです。この場合PEP APIプロバイダは、指定されたリソース・オブジェクトとその子(存在する場合)を問い合せます。次の例では、範囲文字列がリソース文字列(とアプリケーション識別子)を含み、アクションと定義済検索範囲がないリソースを定義しています。したがって、この検索範囲はデフォルトのchildrenになります。

String scope = "resource = PepQueryTest/resource_type_1/resource_1";

- 6.1.1.4.2項「PEP APIのリソース文字列の書式」の説明のとおり、値がimmediateの場合、resourceStringには完全修飾識別子を渡す必要があります。この場合PEP APIプロバイダは、指定されたリソース・オブジェクトを問い合せます。次に例を示します。

String scope = "resource = PepQueryTest/resource_type_1/resource_1,
actions = action1,action2, searchscope=immediate";

次の範囲文字列は、階層型リソースを定義しています。

String scope= "resource = PepQueryTest/hierarchical_type//res1/res2/res3,
searchscope= children";

6.1.1.4.2 PEP APIのリソース文字列の書式

文字列は、区切り文字のフォワード・スラッシュ(/)を使用して、appId/resourceType/resourceNameの書式で記述する必要があります。appIdとresourceTypeを空またはNULLにすることはできません。resourceNameは、問合せリクエストに対して空にすることはできますが、それ以外のすべてのリクエストに対しては値を指定する必要があります。

文字列の書式設定時、resourceNameで文字列を使用する場合には区切り文字をエスケープする必要はありません。たとえば、名前が/res1/res2/res3の階層型リソースがある場合、PEP APIに渡されるリソース文字列はappId/ResType//res1/res2/res3となります。ただし、appIdまたはresourceTypeで使用する場合は、区切り文字をエスケープする必要があります。これらの場合、文字列に3つ以上の区切り文字があると、無効と見なされます。

注意:

myapp/computer\laptop/res1のリソース文字列は、\記号が/と\のいずれも表さないため無効です。

次の例のリストは、これらのルールを示しています。

- myapp/computer\/laptop/res1は、myappアプリケーション内のres1という名前のリソースで、リソース・タイプがcomputer/laptopであることを意味します。

- myapp/computer\\laptop/res1は、myappアプリケーション内のres1という名前のリソースで、リソース・タイプがcomputer\laptopであることを意味します。

- myapp/computer/laptop/res1は、myappアプリケーション内のlaptop/res1という名前のリソースで、リソース・タイプがcomputerであることを意味します。

- myapp/computer/laptop\/res1は、myappアプリケーション内のlaptop\/res1という名前のリソースで、リソース・タイプがcomputerであることを意味します。

- myapp/hierarchialResource\\res1\res2\res3は、myappアプリケーション内の\res1\res2\res3という名前のリソースで、リソース・タイプがhierarchicalResourceであることを意味します。

注意:

Java内の文字列では、\記号自体はエスケープする必要があります。前述の3つの文字列は、Javaでは次のようになります。

- myapp/computer\\/laptop/mybox

- myapp/computer\\\\laptop/mybox

- myapp/computer\\laptop/mybox

6.1.1.5 問合せを使用した認証情報の取得

問合せの操作は、PEP APIを使用して開始できます。問合せでは、次のオブジェクトを入力パラメータとして取り、対応する結果を返します。

- アプリケーション - 結果が、特定のアプリケーションで定義された各リソース・タイプのすべてのリソース・インスタンスに返されます。

- アプリケーションとリソース・タイプ - 結果が、特定のアプリケーションのリソース・タイプの全リソース・インスタンスに返されます。このコールは階層型と非階層型の両方のリソース・タイプに対して有効です。

- アプリケーション、リソース・タイプおよびリソース - 結果が、特定のアプリケーションのリソース・タイプの特定のリソース・インスタンスに返されます。リソース・タイプが階層の場合は、結果が該当するリソースの子にも同様に返されます。

表6-2は、2種類の問合せについて説明しています。問合せのそれぞれのタイプは、階層型と非階層型の両方のリソース・インスタンスで実行できます。

表6-2 PEP API問合せのタイプ

問合せのタイプ

戻り値

メソッド

(定義された範囲に応じて)リソース、子または両方に許可/拒否のアクションを返します。

指定されたサブジェクトの権限を含んだPepRequestを返します。

- searchscope = "immediate"の場合、PepApiプロバイダは指定されたリソース・オブジェクトを問い合せます。

- searchscope = "children"の場合、PepApiプロバイダは指定されたリソース・オブジェクトとその子(存在する場合)を問い合せます。

public PepRequest newQueryPepRequest(Object subjectObj, Object environmentObj, String scope, PepRequestQueryType queryType) throws PepException

リソースとその子についてのすべての認可結果を返します。

リソースとその子についてのすべての認可結果を返します。特定の環境パラメータを持つ現在のサブジェクトへのアクセスを許可または拒否されたリソース-アクションを取得するために使用できるPepRequestを返します。

public PepRequest newQueryPepRequest(Object subjectObj, Object resourceObj, Object actionObj, Object environmentObj, PepResponseType responseType, boolean resourceActionOnly) throws PepException

6.1.2 Java用PEP APIの使用方法

次の項では、Java用PEP APIの使用方法について説明します。

- 6.1.2.1項「Java PEP APIサブジェクトの取得」

- 6.1.2.2項「単純なJava PEP API認可リクエストの実行」

- 6.1.2.3項「Java PEP API義務の処理」

- 6.1.2.4項「Java PEP API一括認可リクエストの実行」

- 6.1.2.5項「Java PEP API問合せリクエストの実行」

- 6.1.2.6項「Java PEP APIの構成」

6.1.2.1 Java PEP APIサブジェクトの取得

この項では、Java用PEP APIで認可リクエストの認可サブジェクトを取得する方法を示したサンプル・コードを説明します。Java Authentication and Authorization Service (JAAS)のサブジェクトには、newPepRequest()メソッドをコールすることをお薦めします。

注意:

文字列のサブジェクトは、JAASサブジェクトに変換されます。

次の例の範囲とリソース文字列の指定方法は、6.1.1.4項「認可リクエスト文字列の書式」を参照してください。

- 例6-1「Java PEP APIリクエストでの認可済サブジェクトの使用方法」

- 例6-2「Java PEP APIリクエストでのWebLogic Serverサブジェクトの使用方法」

- 例6-3「Java PEP APIリクエストでのWebsphere Application Serverサブジェクトの使用方法」

例6-1は、ログイン・サービスで認可済ユーザーを取得し、1つのPEP API認可リクエストに対する認可済サブジェクトの使用方法を示しています。このコードは、指定されたリソースとアクションに基づいて認可の決定を返します。(一括および問合せリクエストは、同様の方法で作成および使用します。)

例6-1 Java PEP APIリクエストでの認可済サブジェクトの使用方法

ServiceLocator locator = JpsServiceLocator.getServiceLocator();
LoginService loginService = locator.lookup(LoginService.class);
CallbackHandler cbh = new MyCallbackHandler("name", "password".toCharArray());

LoginContext ctx = loginService.getLoginContext(new Subject(), cbh);
ctx.login();
Subject s = ctx.getSubject();

String action = "read";
String resourceString = "MyApplication/MyResourceType/MyResource";
Map<String, String> env = new HashMap<String, String>();
env.put("myAttr", "Hello");

//Alternately, a String subject like “tom” can be used.
String action = "read";
String resourceString = "MyApplication/MyResourceType/MyResource";
Map<String, String> env = new HashMap<String, String>();
env.put("myAttr", "Hello");

PepRequest pepRequest =
PepRequestFactoryImpl.getPepRequestFactory().newPepRequest
(s, action, resourceString, env);

PepResponse response = pepRequest.decide();
System.out.println("result: " + response.allowed());
Map<String, Obligation> obligations = response.getObligations();
for (String name : obligations.keySet())
{
System.out.print("obligation: name = " + name + ", values = " +
obligations.get(name).getStringValues());
}

例6-2は、Java Enterprise Edition(JEE)の認証後に、PEP APIで使用するWebLogic Serverサブジェクトの取得方法を示しています。

例6-2 Java PEP APIリクエストでのWebLogic Serverサブジェクトの使用方法

import weblogic.security.Security;

...

Subject s = Security.getCurrentSubject();

String action = "read";
String resourceString = "MyApplication/MyResourceType/MyResource";
Map<String, String> env = new HashMap<String, String>();
env.put("myAttr", "Hello");

PepResponse response =
PepRequestFactoryImpl.getPepRequestFactory().newPepRequest
(s, action, resourceString, env).decide();
System.out.println("result: " + response.allowed());
Map<String, Obligation> obligations = response.getObligations();
for (String name : obligations.keySet()) {
System.out.print("obligation: name = " + name + ", values = "
+ obligations.get(name).getStringValues());
}

例6-3は、Java Enterprise Edition(JEE)の認証後に、PEP APIで使用するWebsphere Application Serverサブジェクトの取得方法を示しています。

例6-3 Java PEP APIリクエストでのWebsphere Application Serverサブジェクトの使用方法

import com.ibm.websphere.security.auth.WSSubject;

...
Subject s = WSSubject.getCallerSubject();

String action = "read";
String resourceString = "MyApplication/MyResourceType/MyResource";
Map<String, String> env = new HashMap<String, String>();
env.put("myAttr", "Hello");

PepResponse response = PepRequestFactoryImpl.getPepRequestFactory().
newPepRequest(s, action, resourceString, env).decide();
System.out.println("result: " + response.allowed());
Map<String, Obligation> obligations = response.getObligations();
for (String name : obligations.keySet())
{
System.out.print("obligation: name = " + name + ", values =
" + obligations.get(name).getStringValues());
}

6.1.2.2 単純なJava PEP API認可リクエストの実行

Oracle Entitlements Serverでは2種類の問合せリクエストが提供されています。特定のリソース(とその子)のすべてのアクションのリストをリクエストするか、特定のリソース(とその子)のすべての認可の結果をリクエストできます。両方の種類の問合せでは、特定のリソース・タイプのすべてのインスタンス化されたリソースの結果を取得します。例6-4は、特定のリソースに対する問合せリクエストです。検索範囲がimmediateに定義されていることに注意してください。範囲とリソース文字列の指定方法は、6.1.1.4項「認可リクエスト文字列の書式」を参照してください。

例6-4 リソースに対するJava PEP API認可のリクエスト

...
String scope = "resource = PepQueryTest/resource_type_1/resource_1,
actions = action1, searchscope=immediate";
PepRequest req = PepRequestFactoryImpl.getPepRequestFactory().
newQueryPepRequest(subject, env, scope,
PepRequestQueryType.RETURN_ONLY_ALLOWED_RESULTS);

PepResponse resp = req.decide();

//List of RuntimeAction objects
List actions = (List) resp.getAction();
RuntimeResource resource = (RuntimeResource) resp.getResource();

6.1.2.3 Java PEP API義務の処理

義務にはアクセスの決定と一緒にコール側アプリケーションに返される追加の情報を指定します。PEP APIレスポンスのそれぞれの義務には、Map<String, String>のタイプのマップがあります。(String値を囲む二重引用符はありません。)次の例の範囲とリソース文字列の指定方法は、6.1.1.4項「認可リクエスト文字列の書式」を参照してください。

- 例6-5「PEP APIリクエストおよび解析レスポンスの実行」

- 例6-6「返された義務」

例6-5は、義務もリクエストする認可リクエストです。

例6-5 PEP APIリクエストおよび解析レスポンスの実行

Subject s = ...; // a Jps subject (with app roles inside)
String action = "read";
String resourceString = "MyApplication/MyResourceType/MyResource";
Map<String, String> env = new HashMap<String, String>();
env.put("myAttr", "Hello");

PepResponse response =
PepRequestFactoryImpl.getPepRequestFactory().newPepRequest
(s,action,resourceString,env).decide();
System.out.println("result: " + response.allowed());
Map<String, Obligation> obligations = response.getObligations();
for (String name : obligations.keySet())
{         System.out.print("obligation: name = " + name + ", values = " + obligations.get(name).getStringValues());         }

例6-6は、義務出力の例です。この場合も、文字列を囲む二重引用符はありません。

例6-6 例6-5から返された義務

result: true
obligation: name = MyObligation, values =
{attr1=18, attr2=World, time=08:59:59, attr_date=12/29/2010}

6.1.2.4 Java PEP API一括認可リクエストの実行

例6-7は、認可を一括でリクエストするように記述されたサンプル・コードです。2つのリクエストをカプセル化しています。

例6-7 Java PEP APIによる一括認可のリクエスト

public void testBulkRequest() throws Exception {
Map<String, String> env = new HashMap<String, String>();
env.put("dynamic_attr", "dynamic_attr_value");
String resourceString =
MY_APPLICATION + "/" + MY_RESOURCE_TYPE + "/" + MY_RESOURCE;
String wrongAction = "wrong_action";
PepResponse resp = pepRequestFactory.newBulkPepRequest(
subject,
Arrays.asList(new Object[]{MY_ACTION, wrongAction}),
Arrays.asList(new Object[]{resourceString, resourceString}),
env).decide();

//
// response corresponding to first authorization decision
//

assertTrue(resp.next());

assertTrue("resp.allowed() is expected to be true!! ", resp.allowed());
assertSame(MY_ACTION, resp.getAction());
assertSame(RESOURCE_STRING, resp.getResource());

//
// response corresponding to second authorization decision
//

assertTrue(resp.next());

assertFalse("resp.allowed() is expected to be false!! ", resp.allowed());
assertSame(wrongAction, resp.getAction());
assertSame(RESOURCE_STRING, resp.getResource());

//
// call next() again..
//
assertFalse(resp.next());
}

これらの例の範囲とリソース文字列の指定方法は、6.1.1.4項「認可リクエスト文字列の書式」を参照してください。

6.1.2.5 Java PEP API問合せリクエストの実行

Java用PEP APIにはnewQueryPepRequest()メソッドが含まれており、認可リクエストによって適用されるリソースの範囲とアクションに関する情報を取得できます。範囲は、メソッドに渡されるサブジェクトと環境オブジェクトに基づきます。(範囲とリソース文字列の指定方法は、6.1.1.4項「認可リクエスト文字列の書式」を参照してください。)返される情報は、PepRequestQueryTypeがどのように定義されているかによります。次のいずれかの値を取得します。

- RETURN_ONLY_ALLOWED_RESULTSによって、定義された範囲内で許可されるリソース・アクションのペアのリストが返されます。

- RETURN_ONLY_DENIED_RESULTSによって、定義された範囲内で拒否されるリソース・アクションのペアのリストが返されます。

- VERBOSEによって、定義済の範囲内からリクエストされたリソース・アクションのペアごとにすべての結果が返されます。

例6-8は、PepRequestQueryType列挙の値の1つとして問合せタイプを定義可能なシグネチャを示しています。

例6-8 Java PEP APIの問合せタイプの定義

public PepRequest newQueryPepRequest
(object subjectObj,
Object environmentObj
String scope
PepRequestQueryType queryType)

例6-9は、新しいPepResponseType列挙の値の1つとして、問合せタイプを定義可能なシグネチャを示しています。resourceActionOnlyは、レスポンスで、リソースとアクション(問合せの適用先)のアイデンティティのみを表す情報が返されるか、完全なレスポンス(義務を含む)が返されるかを示すブールです。

例6-9 新しいJava PEP APIのリソース・タイプの定義

public PepRequest newQueryPepRequest
(java.lang.Object subjectObj,
java.lang.Object resourceObj,
java.lang.Object actionObj,
java.lang.Object environmentObj,
org.openliberty.openaz.azapi.constants.PepResponseType responseType,
boolean resourceActionOnly)

例6-10は、特定のリソースとその子に対して許可および拒否されたすべてのアクションをリクエストする問合せです。検索範囲はchildrenに定義されていることに注意してください。

例6-10 Java PEP APIによるリソースおよび子への詳細問合せ

...
String scope = "resource=PepQueryTest/Hierarchical/\\/res1";

PepRequest req = PepRequestFactoryImpl.getPepRequestFactory
(subject, env, scope, PepRequestQueryType.VERBOSE);
PepResponse resp = req.decide();

ArrayList arrayList;
List grantedActions;
List deniedActions;

int i = 0;

//there can be more than 1 result when searchscope="children"
while (resp.next()) {
RuntimeResource res = (RuntimeResource) resp.getResource();

//both granted actions and denied actions are returned for PepRequestQueryType.VERBOSE
//PepResponse.getAction() returns an ArrayList where ArrayList.get(0) returns list of granted actions;
//it returns an ArrayList where ArrayList.get(1) returns list of denied actions;

arrayList = (ArrayList) resp.getAction();
grantedActions = null;
deniedActions = null;

if (arrayList != null) {
grantedActions = (List) arrayList.get(0);
deniedActions = (List) arrayList.get(1);
}
String resourceName = res.getResourceName();
}

例6-11は、immediate検索範囲で許可された結果のみを返す問合せコードです。

例6-11 Java PEP APIによるimmediateの検索範囲の問合せリクエスト

String scope = "resource=PepQueryTest/resource_type_1/resource_1,
actions=action1, searchscope=immediate";
PepRequest req =
PepRequestFactoryImpl.getPepRequestFactory().newQueryPepRequest
(subject, env, scope, PepRequestQueryType.RETURN_ONLY_ALLOWED_RESULTS);
PepResponse resp = req.decide();

//Getting list of RuntimeAction objects
List actions = (List) resp.getAction();
RuntimeResource resource = (RuntimeResource) resp.getResource();

例6-12は、children検索範囲での許可および拒否の結果を返す問合せコードです。

例6-12 Java PEP APIによるchildrenの検索範囲の問合せリクエスト

String scope = "resource=PepQueryTest/Hierarchical/\\/res1";
PepRequest req = PepRequestFactoryImpl.getPepRequestFactory
(subject, env, scope, PepRequestQueryType.VERBOSE);
PepResponse resp = req.decide();

ArrayList arrayList;
List grantedActions;
List deniedActions;

int i = 0;

//there can be more than 1 result when searchscope="children"
while (resp.next()) {
RuntimeResource res = (RuntimeResource) resp.getResource();

//both granted actions and denied actions are returned for //PepRequestQueryType.VERBOSE
//PepResponse.getAction() returns an ArrayList where ArrayList.get(0)
//returns list of granted actions;
//it returns an ArrayList where ArrayList.get(1) returns list of denied actions;

arrayList = (ArrayList) resp.getAction();
grantedActions = null;
deniedActions = null;

if (arrayList != null) {
grantedActions = (List) arrayList.get(0);
deniedActions = (List) arrayList.get(1);
}
String resourceName = res.getResourceName();
}

例6-13は、義務とともに許可および拒否の結果のみを返す問合せコードです。

例6-13 Java PEP APIによる許可/拒否の結果と義務の問合せリクエスト

String resourceString = "MyApplication/MyResourceType/MyResource";
String action = "read";
PepRequest req = pepRequestFactory.newQueryPepRequest(subject,
resourceString, action, null, PepResponseType.ALL_RESULTS, true);

PepResponse resp = req.decide();
while (resp.next()) {
//print authorization results for each resource and action.
System.out.println(“For resource “ + resp.getResource() + “  and action” +
resp.getAction() + “ authorization allowed = “ + resp.allowed());

//check out obligations
Map<String, Obligation> obligations = resp.getObligations();
Set<String> obIds = obligations.keySet();
for (String obId : obIds) {
Obligation obligation = obligations.get(obId);
Map<String, String> strValus = obligation.getStringValues();
}
}

6.1.2.6 Java PEP APIの構成

Java PEP APIを使用するには、アイデンティティ・ストア、ポリシー・ストア、ポリシー配布サービスおよびユーザー・アサーション・ログイン・モジュールをjps-config.xml構成ファイルで定義する必要があります。

注意:

この構成ファイルの詳細は、『Oracle Fusion Middlewareセキュリティ・ガイド』を参照してください。Oracle Entitlements Server固有のパラメータは、『Oracle Fusion Middleware Oracle Entitlements Server管理者ガイド』を参照してください。

例6-14は、参考用に転載したjps-config.xmlの一部です。

例6-14 jps-config.xmlのサンプル・ファイル

...
<serviceInstance name="idstore.ldap" provider="idstore.ldap.provider">
<description>LDAP Identity Store Service Instance</description>
<property name="idstore.config.provider"
value="oracle.security.jps.wls.internal.idstore.WlsLdapIdStoreConfigProvider"/>
<property name="CONNECTION_POOL_CLASS"
value="oracle.security.idm.providers.stdldap.JNDIPool"/>
</serviceInstance>
<serviceInstance name="idstore.loginmodule" provider="jaas.login.provider">
<description>Identity Store Login Module</description>
<property name="loginModuleClassName"
value="oracle.security.jps.internal.jaas.module.idstore.IdStoreLoginModule"/>
<property name="jaas.login.controlFlag" value="REQUIRED"/>
</serviceInstance>
<serviceInstance name="pdp.service" provider="pdp.service.provider">
<description>Runtime PDP service instance</description>
<property name="oracle.security.jps.runtime.pd.client.sm_name" value="mixedsm"/>
<property name="oracle.security.jps.runtime.pd.client.localpolicy.work_folder"
value="/ade/diazhao_entsec_
2/oracle/work/utp/buildout/functional/platsec/tempdir/mixedpd-work"/>
<property name="oracle.security.jps.pdp.AuthorizationDecisionCacheEnabled"
value="true"/>
<property
name="oracle.security.jps.pdp.AuthorizationDecisionCacheEvictionCapacity"
value="500"/>
<property
name="oracle.security.jps.pdp.AuthorizationDecisionCacheEvictionPercentage"
value="10"/>
<property name="oracle.security.jps.pdp.AuthorizationDecisionCacheTTL"
value="60"/>
<property name="oracle.security.jps.pd.client.PollingTimerEnabled" value="true"/>
<property name="oracle.security.jps.pd.client.PollingTimerInterval" value="10"/>
<property name="oracle.security.jps.ldap.cache.refresh.interval" value="10000"/>
<property name="oracle.security.jps.runtime.pd.client.policyDistributionMode"
value="mixed"/>
</serviceInstance>
<serviceInstance name="policystore.db" provider="policystore.provider">
<property name="policystore.type" value="DB_ORACLE"/>
<property name="oracle.security.jps.farm.name"
value="cn=testfarm_diazhao_entsec_2"/>
<property name="server.type" value="DB_ORACLE"/>
<property name="oracle.security.jps.ldap.root.name" value="cn=jpsroot"/>
<property name="datasource.jndi.name" value="platsec_test_ds"/>
</serviceInstance>
<serviceInstance name="user.assertion.loginmodule" provider="jaas.login.provider">
<description>User Assertion Login Module</description>
<property name="loginModuleClassName" value="oracle.
security.jps.internal.jaas.module.assertion.JpsUserAssertionLoginModule"/>
<property name="jaas.login.controlFlag" value="REQUIRED"/>
</serviceInstance>
...
<jpsContexts default="default">
<jpsContext name="default">
<serviceInstanceRef ref="credstore.db"/>
<serviceInstanceRef ref="keystore.db"/>
<serviceInstanceRef ref="policystore.db"/>
<serviceInstanceRef ref="audit.db"/>
<serviceInstanceRef ref="trust"/>
<serviceInstanceRef ref="pdp.service"/>
<serviceInstanceRef ref="attribute"/>
<serviceInstanceRef ref="idstore.ldap"/>
</jpsContext>
</jpsContexts>

6.1.3 .NET用PEP APIの使用方法

.NET用PEP APIは、Oracle Entitlements Serverの認可をMicrosoft .NETテクノロジを使用して構築されたアプリケーションに統合するために使用します。.NETアプリケーションによって.NET用PEP APIがコールされ、認可の決定が取得されます。(.NET用PEP APIは、プロキシ実装(フェイルオーバーとキャッシングを処理)経由で、Webサービス・セキュリティ・モジュールで提供されている認可Webサービスを呼び出します。)

認可に.NETセキュリティ・モジュールを呼び出すには、適用可能なリソースとアクションのペアを表す、アクションオブジェクトのリストと対応するリソース・オブジェクトのリストを提供するIPepRequestを作成します。リソースとアクションの各ペアに対する認可の決定がIPepRequest.decide()の呼び出し時に返されます。次の項では、.NET用PEP APIアプリケーションの使用方法について説明します。

- 6.1.3.1項「.NET PEP APIサブジェクトの取得」

- 6.1.3.2項「単純なNET PEP API認可リクエストの実行」

- 6.1.3.3項「.NET PEP API義務の処理」

- 6.1.3.4項「.NET PEP API一括認可リクエストの実行」

- 6.1.3.5項「.NET PEP API問合せリクエストの実行」

- 6.1.3.6項「.NET PEP APIの構成」

6.1.3.1 .NET PEP APIサブジェクトの取得

IPepRequestコールのサブジェクトは次のいずれかの操作で定義できます。

- ユーザー名を文字列で渡します。

- System.Security.Principal.IIdentityユーザー・オブジェクトを渡します。このオブジェクトは.NET標準オブジェクトであり、Oracle Entitlements ServerがサポートするWindowsオペレーティング・システムによる認証を表します。次のようにIIdentityユーザー・オブジェクトを取得します。

- スタンドアロン・アプリケーションの場合は次の記述を使用します。

IIdentity iIdentity = WindowsIdentity.GetCurrent();

- Webアプリケーションの場合は次の記述を使用します。

IIdentity iIdentity = (IIdentity)(HttpContext.Current.User.Identity);

- .NETアプリケーションにカスタム認証がある場合、UserPricipalクラスを使用して、ユーザー情報を設定しUserPrincipalオブジェクトを渡します。

6.1.3.2 単純なNET PEP API認可リクエストの実行

Oracle Entitlements Serverでは、認可(単一と一括)および問合せのリクエストを提供しています。特定のリソース(とその子)のすべてのアクションのリストをリクエストするか、特定のリソース(とその子)のすべての認可の結果を問い合せることができます。両方の種類の問合せは、特定のリソース・タイプのすべてのインスタンス化されたリソースの結果を取得するために使用することもできます。

渡される認可情報には、認証済サブジェクト(例、iIdentity)、アクションを表すオブジェクトのリスト[例、String (read)]、リソースを表すオブジェクトのリスト(例、applicationId/resourcetype/resource)および環境を表すオブジェクト(ハッシュテーブルの形式で渡される情報を含む)があります。例 6-15「リソースに対する.NET PEP API認可のリクエスト」での範囲とリソース文字列の指定方法は、6.1.1.4項「認可リクエスト文字列の書式」を参照してください。このコードには、6.1.3.3項「.NET PEP API義務の処理」で説明されている義務も含まれています。

例6-15 リソースに対する.NET PEP API認可のリクエスト

String action = "read";
String resourceString = "MyApplication/MyResourceType/MyResource";
Hashtable env = new Hashtable();
env.Add("myAttr", "Hello");
IIdentity iIdentity = WindowsIdentity.GetCurrent();
IPepResponse response =
PepRequestFactoryImpl.GetPepRequestFactory().NewPepRequest
(iIdentity, action, resourceString, env).Decide();
Console.Write ("result: " + response.Allowed());
Dictionary<String, IObligation> obligations = response.GetObligations();

foreach (KeyValuePair<String, IObligation> entry in obligations)
{Console.WriteLine
("Print the obligation" + entry.Value.GetStringValues());
}

例6-16は、サブジェクトが文字列として指定されているときに、.NET PEP APIを使用した認可をリクエストします。

例6-16 文字列サブジェクトによる.NET PEP API認可のリクエスト

String action = "read";
String resourceString = "MyApplication/MyResourceType/MyResource";
IPepResponse response = PepRequestFactoryImpl.GetPepRequestFactory().
NewPepRequest("John", action, resourceString).Decide();
Console.WriteLine("result: " + response.Allowed());

例6-17は、サブジェクトがUserPrincipalとして指定されているときに、.NET PEP APIを使用した認可をリクエストします。

例6-17 UserPrincipalサブジェクトによる.NET PEP API認可のリクエスト

UserPrincipal userPrincipal = new UserPrincipal("user1");
Hashtable envTable = new Hashtable();
String action = "read";
String resourceString = "MyApplication/MyResourceType/MyResource";
IPepResponse response = PepRequestFactoryImpl.GetPepRequestFactory().
NewPepRequest
(userPrincipal, action, resourceString, envTable).Decide();
Console.WriteLine("result: " + response.Allowed());

6.1.3.3 .NET PEP API義務の処理

IObligationインタフェースのGetObligationId()メソッドは、認可リクエストに関連する義務を取得するために使用します。義務にはアクセスの決定と一緒にコール側アプリケーションに返される追加の情報を指定します。例6-15(前の項)は、義務を取得する認可リクエストです。例6-18に別の例を示します。

例6-18 .NET PEP APIによる単一の認可と義務のリクエスト

String appId = "test-app";
String userName = "weblogic";
String resourceType = "Electronics-MyRT";
String resource1 = ":Nelco1";
String action1 = "view";
String action2 = "off";IPepRequestFactory pepRequestFactoryImpl =
PepRequestFactoryImpl.GetPepRequestFactory();
Hashtable envTable = new Hashtable();
envTable.Add("electronicType", "entertainment");
IPepResponse pepresponse = pepRequestFactoryImpl.NewPepRequest
(userName, action1, appId + "/" + resourceType + "/" + resource1,
envTable).Decide();
Dictionary<String,IObligation> obligations=pepresponse.GetObligations();
foreach (KeyValuePair<String, IObligation> entry in obligations)
{
Console.WriteLine("Print the obligation" + entry.Value.GetStringValues());
}

6.1.3.4 .NET PEP API一括認可リクエストの実行

範囲とリソース文字列の指定方法は、6.1.1.4項「認可リクエスト文字列の書式」を参照してください。例6-19は一括認可のコールを示しています。

例6-19 一括認可のリクエスト

String appId = "test-app";
String userName = "weblogic";
String authenticatedUser = "weblogic";
//String resourceType = "LibraryResourceType";
String resourceType = "Electronics-MyRT";
String resource1 = ":Nelco1";
String resource2 = ":Nelco1:TV";
String resource3 = ":Nelco1:TV:small-screen";
String action1 = "view";
String action2 = "on";
String action3 = "off";

IPepRequestFactory pepRequestFactoryImpl =
PepRequestFactoryImpl.GetPepRequestFactory();
IPepResponse pepresponse=null;
bool isNext = false;
Collection<Object> resList = new Collection<Object>();
resList.Add(appId + "/" + resourceType + "/" + resource1);
resList.Add(appId + "/" + resourceType + "/" + resource2);
Collection<Object> actList = new Collection<Object>();
actList.Add(action1);
actList.Add(action3);
Hashtable envTable = new Hashtable();
envTable.Add("electronicType", "entertainment");
pepresponse = pepRequestFactoryImpl.NewBulkPepRequest
(userName, actList, resList, envTable).Decide();

//First authorization decision
isNext = pepresponse.Next();
Debug.Assert(isNext == false, "Error in bulk operation");
Debug.Assert(pepresponse.Allowed() == false, "Error in bulk operation");

//Second authorization decision
isNext = pepresponse.Next();
Debug.Assert(isNext == false, "Error in bulk operation");
Debug.Assert(pepresponse.Allowed() == true, "Error in bulk operation");

6.1.3.5 .NET PEP API問合せリクエストの実行

.NET用PEP APIにはnewQueryPepRequest()メソッドが含まれており、認可リクエストによって適用されるリソースの範囲とアクションに関する情報を取得できます。範囲は、メソッドに渡されるサブジェクトと環境オブジェクトに基づきます。(範囲とリソース文字列の指定方法は、6.1.1.4項「認可リクエスト文字列の書式」を参照してください。)返される情報は、PepRequestQueryTypeがどのように定義されているかによります。次のいずれかの値を取得します。

- RETURN_ONLY_ALLOWED_RESULTSによって、定義された範囲内で許可されるリソース・アクションのペアのリストが返されます。例6-20を参照してください。

- RETURN_ONLY_DENIED_RESULTSによって、定義された範囲内で拒否されるリソース・アクションのペアのリストが返されます。例6-21を参照してください。

- VERBOSEによって、定義済の範囲内からリクエストされたリソース・アクションのペアごとにすべての結果が返されます。例6-22を参照してください。

例6-20 許可されたリソース・アクション・ペアのリストに対する.NET問合せ

String appId = "MyApplication";
String resourceType = "resourceType";
String resource = "res";
IIdentity iIdentity = WindowsIdentity.GetCurrent();
IPepRequestFactory pepRequestFactoryImpl =
PepRequestFactoryImpl.GetPepRequestFactory();
IPepResponse pepresponse=null;
String actionStr="view,on,off";
bool isNext=false;
String scopeImmediate = "resource=" + "application" + "/" + "resource_type" +
"/" + "resource2" + ", actions=" + actionStr + ",searchscope=immediate";
Hashtable envTable = new Hashtable();
envTable.Add("electronicType", "entertainment");

pepresponse = pepRequestFactoryImpl.NewQueryPepRequest
(iIdentity, envTable,scopeImmediate,PepRequestQueryType.
RETURN_ONLY_ALLOWED_RESULTS).Decide();

isNext=pepresponse.Next();
Object act = pepresponse.GetAction();
List<String> actList = (List<String>)act;
if (actList.Contains("view") && actList.Contains("on"))
{ Debug.Assert(actList.Count == 2, "Invalid result");
}

例6-21 拒否されたリソース・アクション・ペアのリストに対する.NET問合せ

String appId = "MyApplication";
String resourceType = "resourceType";
String resource = "res";
IIdentity iIdentity = WindowsIdentity.GetCurrent();
IPepRequestFactory pepRequestFactoryImpl =
PepRequestFactoryImpl.GetPepRequestFactory();
IPepResponse pepresponse=null;
String actionStr = "view,on,off";
bool isNext = false;
String scopeImmediate = "resource=" + "application" + "/" + "resource_type" +
"/" + "resource2" + ", actions=" + actionStr + ",searchscope=immediate";
Hashtable envTable = new Hashtable();
envTable.Add("electronicType", "entertainment");
pepresponse = pepRequestFactoryImpl.NewQueryPepRequest
(iIdentity, envTable, scopeImmediate, PepRequestQueryType.
RETURN_ONLY_DENIED_RESULTS).Decide();
isNext = pepresponse.Next();
Object act = pepresponse.GetAction();
List<String> actList = (List<String>)act;
if (actList.Count == 1 || actList[0].Equals("off"))
{
Debug.Assert(actList.Count == 1, "Invalid result");
}

例6-22 すべてのリソース・アクション・ペアのリストに対する.NET問合せ

String appId = "MyApplication";
String resourceType = "resourceType";
String resource = "res";
IIdentity iIdentity = WindowsIdentity.GetCurrent();
//for standalone
IPepRequestFactory pepRequestFactoryImpl =
PepRequestFactoryImpl.GetPepRequestFactory();
IPepResponse pepresponse=null;
String actionStr = "view,on,off";
String scopeImmediate = "resource=" + "application" + "/" + "resource_type" +
"/" + "resource2" + ", actions=" + actionStr + ", searchscope=immediate";
Hashtable envTable = new Hashtable();
envTable.Add("electronicType", "entertainment");

pepresponse = pepRequestFactoryImpl.NewQueryPepRequest
(iIdentity, envTable, scopeImmediate, PepRequestQueryType.VERBOSE).Decide();

//isNext = pepresponse.Next();
Object act = pepresponse.GetAction();
List<List<String>> actList = (List<List<String>>)act;
List<String> actListAllowed = actList[0];
List<String> actListDenied = actList[1];
if (actListAllowed.Count == 2)
{ Debug.Assert(actListAllowed.Count == 2, "Invalid result");
}
if (actListDenied.Count == 1)
{
Debug.Assert(actListDenied.Count == 1, "Invalid result");
}

例6-23は、指定されたリソースとその子に対する認可の問合せを示しています。searchscope=childrenであることに注意してください。

例6-23 リソースとその子に対する認可の結果のリクエスト

IPepRequestFactory pepRequestFactoryImpl =
PepRequestFactoryImpl.GetPepRequestFactory();
IPepResponse pepresponse=null;
String actionStr = "view,on,off";
String scopeImmediate = "resource=" + "application" + "/" + "resource_type" +
"/" + "resource2" + ", actions=" + actionStr + ",searchscope=children";
Hashtable envTable = new Hashtable();
envTable.Add("electronicType", "entertainment");

IIdentity iIdentity = WindowsIdentity.GetCurrent();pepresponse = pepRequestFactoryImpl.NewQueryPepRequest
(iIdentity, envTable, scopeImmediate, PepRequestQueryType.VERBOSE).Decide();

//isNext = pepresponse.Next();
Object act = pepresponse.GetAction();
List<List<String>> actList = (List<List<String>>)act;
List<String> actListAllowed = actList[0];
List<String> actListDenied = actList[1];
if (actListAllowed.Count == 2)
{ Debug.Assert(actListAllowed.Count == 2, "Invalid result");
}
if (actListDenied.Count == 1)
{
Debug.Assert(actListDenied.Count == 1, "Invalid result");
}

6.1.3.6 .NET PEP APIの構成

.NET PEP APIは、ダイナミック・リンク・ライブラリ(DLL)によってMicrosoft .NETアプリケーションに提供されます。.NETアプリケーション開発者は、保護対象のアプリケーションの一部としてOES-PEP.dllを組み込む必要があります。さらに、次のように構成プロセスにも組み込みます。

1. 保護対象のアプリケーションの一部としてOES-PEP.dllを組み込みます。これは.NETのアプリケーション開発者が行います。

2. OES_CLIENT_HOME/oessm/dotnetsm/configtool/ディレクトリにあるdotnetsm_config.propertiesファイルの次のプロパティを更新します。

- gac.utility: DLLが登録された.NET Frameworkのグローバル・アセンブリ・ユーティリティ・パスを定義します。

- wssm.smurl: .NETアプリケーションがOracle Entitlements Serverと通信するために使用する、Web Serviceセキュリティ・モジュールのURLを定義します。

- application.config.file: 保護対象のアプリケーションの構成ファイルを定義します。このパラメータの有効値は2つあります。Webアプリケーションの場合は、構成ファイルの名前がweb.configとなります。スタンドアロン・アプリケーションの場合は、構成ファイルの名前がapp.configとなります。

- operation : 準備するアクションを定義します。このパラメータには2つの有効値があります。configは構成を表します。removeは.NETアプリケーションの構成ファイルに追加されたすべての構成を削除し、さらにGACユーティリティから登録済のOES-PEP.dllとlog4net.dllを削除します。

- application.log4NetXmlfil: .NETセキュリティ・モジュールのログ・ファイルを生成するlog4net.xmlのパスを定義します。.NETアプリケーションがすでにログ・ファイルを生成している場合は、既存のlog4net.xmlの場所を使用します。そうでない場合は、OES_CLIENT_HOME/dotnetsm/logging/にある、.NETセキュリティ・モジュールのlog4net.xmlファイルを使用します。

3. Windowsマシンで次のコマンドを使用して構成ツールを実行します。smTypeはインスタンス化するセキュリティ・モジュールのタイプを表します(この場合はdotnet)。さらにsmConfigIdは、セキュリティ・モジュールがインスタンス化されたときに定義された識別子を表します(この場合はmyDotnet)。

config.cmd -smType dotnet -smConfigId myDotnet

このツールは、保護対象のアプリケーションをホストするWindowsマシンでOES-PEP.dllおよびlog4net.dllを登録し、アプリケーションの構成ファイル(web.configまたはapp.config)をWebサービス・セキュリティ・モジュールとロギング構成ファイルの場所で更新します。さらに、次のプロパティも定義します。

- oracle.security.jps.pdp.proxy.RequestTimeoutMilliSecs - サーバーがレスポンスしない場合にリクエストがタイムアウトになるまでの時間間隔です。デフォルト値は10(秒)です。

- oracle.security.jps.pdp.proxy.FailureRetryCount - 代替のフェイルオーバー・サーバーへ試行する前に、サーバーにアクセスを試行する回数です。デフォルト値は3(回の試行)です。

- oracle.security.jps.pdp.proxy.FailbackTimeoutMilliSecs - プライマリ・サーバーと通信を再試行できるようになるまでの時間間隔です。デフォルト値は3(分)です。

- oracle.security.jps.pdp.proxy.SynchronizationIntervalMilliSecs - 状態を同期するために、PDPプロキシがPDPサーバーをポーリングする頻度を定義します。たとえば、この間隔は、認可キャッシュをフラッシュする必要があるかどうかを定期的にチェックするために使用されます。デフォルト値は60(秒)です。

6.2 checkPermission()コールの実行

checkPermission()は、Java Permissionオブジェクトを使用して保護されたリソースへのアクセスを決定します。JavaのPermissionオブジェクトは、リソースへのアクセスを表し、適用可能な構成済ポリシーに基づいて作成され、(付与されたアクセスが)割り当てられます。Oracle Entitlements Serverでは、次の標準クラスでcheckPermission()メソッドを使用できます。

- java.lang.SecurityManager

- java.security.AccessController

注意:

静的なAccessController.checkPermissionメソッドは、デフォルトのアクセス制御コンテキスト(スレッド作成時に継承されるコンテキスト)を使用します。その他のコンテキストでパーミッションを確認するには、特定のAccessControlContextインスタンスでcheckPermission()メソッドのインスタンスをコールします。

さらに、Oracle Entitlements Serverは、oracle.security.jps.util.JpsAuthクラスでcheckPermission()メソッドの使用をサポートしています。

ヒント:

oracle.security.jps.util.JpsAuthクラスのcheckPermission()メソッドを使用することをお薦めします。これは、改善されたデバッグ・サポート、優れたパフォーマンスおよび監査サポートを提供しています。

(JavaSEアプリケーションで)checkPermission()メソッドを呼び出す場合は次の点を確認してください。

1. java.security.policyシステム・プロパティがOracle Platform Security Services/Oracle WebLogic Serverポリシー・ファイルの場所に設定済である。

2. アプリケーションが最初にsetPolicy()メソッドをコールし、明示的にポリシー・プロバイダを設定している。次のサンプル・コードはこの設定を示しています。

java.security.Policy.setPolicy(new
oracle.security.jps.internal.policystore.JavaPolicyProvider());

oracle.security.jps.util.JpsAuth.checkPermission()は、Permissionオブジェクトを受け入れることで標準メソッドとして厳密に機能します。リクエストされたアクセスが許可される場合は、checkPermission()が出力なしに返り、拒否される場合はAccessControlExceptionがスローされます。例6-24はcheckPermission()の使用方法を示しています。

例6-24 checkPermission()メソッドの使用方法

java.security.Policy.setPolicy(new
oracle.security.jps.internal.policystore.JavaProvider()); // Java SE env only
PolicyContext.setContextID(TARGET_APP); // Java SE env only

// authorization runtime
Subject s = new Subject(); s.getPrincipals().add(new WLSUserImpl("wcai")); s.setReadOnly();
JpsSubject.invokeAs(s, new PrivilegedAction<Object>() {

public Object run() {
FilePermission perm2 = new FilePermission(“HARRY_PORTER”, "read");
psAuth.checkPermission(perm2);
return null;
}

6.3 XACMLゲートウェイの使用方法

Oracle Entitlements Serverは、外部アプリケーションにXACML 2.0プロトコルを使用した認可の質問を許可します。Webサービス・セキュリティ・モジュールにはXACMLゲートウェイがあり、XACML認可リクエストの許可と、XACML認可レスポンスの返送を可能にしています。この機能は、マルチ・プロトコル・セキュリティ・モジュールを使用している場合にのみサポートされます。

Webサービス・セキュリティ・モジュールのXACMLゲートウェイは、リモートPDPとして機能します。PEPとPDP間では、標準のXACML 2.0コンテキストを使用して、認可リクエストとレスポンスが送受信されます。次に、XACML認証リクエストのプロセス・シーケンスを示します。

1. PEP(アプリケーション)がセッションを確立し、ユーザーを認証して、そのプリンシパルの有効なトークンを取得します。
例6-25は、セッションを確立し、XACML 2.0認可リクエストを送信する方法を示しています。例6-26は代替の方法を示しています。

例6-25 XACMLゲートウェイのセッションを確立するサンプル・コード

setupSession();
request = createRequest();
try {
resp = xacmlSvc.authorize(request);
} catch (AxisFault af) {
if (isTokenExpired(af)) {
resetupSession();
try {
resp = xacmlSvc.authorize(request);
}
catch (RemoteException e) {
throw new XACMLException("Error calling the XACML service.", e);
}
}
else {
throw new XACMLException(“Error calling the XACML service.”, af);
}
} catch (RemoteException e) {
throw new XACMLException("Error calling the XACML service.", e);
}

private boolean isTokenExpired(AxisFault af) {
String faultReason = af.getFaultReason();
if((faultReason != null) && (faultReason.indexOf
("IdentityAssertionException") != -1)) {
return true;
}
return false;
}

private void setupSession() throws XACMLException {
if (identity == null) {
establishSession();
}
}

private void resetupSession() throws XACMLException {
establishSession();
}

private void establishSession() throws XACMLException {
try {
EstablishSessionType sess = new EstablishSessionType();
sess.setPrincipalsInfo(convertSubjectToPrincipalsInfo(subject));
sess.setRequestedCredentialType(OES_CREDENTIAL_TYPE);
AuthenticationResultType result = atzSvc.establishSession(sess);
identity = result.getIdentityAssertion();
}
catch (Exception e) {
throw new XACMLException("Unable to authenticate user.", e);
}
if (identity == null) {
throw new XACMLException("Null identity received.
Unable to establish session for " + subject);
}
System.out.println("Authentication Succeeded, Identity: ");
MessageElement ele = identity.get_any()[0];
System.out.println(ele.getFirstChild());
}

例6-26は、すべてのリクエストにサブジェクトを渡すことができ、establishSessionメソッドを必要としない新しいモードを示しています。例6-25の以前のモードは依然としてサポートされています。

例6-26 プリンシパル情報によりセッションを確立するサンプル・コード

/**
* Test authorize for user role in new mode which send the principal info in
every request.
* @throws Exception
*/
public void testAtzForUserRoleNewMode() throws Exception {
SubjectType sbjct1 = constructSubject(OTHER_USER, new String[]{OTHER_ROLE});
SubjectType sbjct2 = constructSubject(ADMIN_USER, new String[]{ADMIN_ROLE});

printTestHeader("Deny Test: user \"" + OTHER_USER + "\" is in role \"" +
OTHER_ROLE + "\"");
sendRequest(new SubjectType[]{sbjct1}, new ResourceType[]{resTest1},
actionWrite, emptyEnv);

printTestHeader("Permit Test: user \"" + ADMIN_USER + "\" is in role \"" +
ADMIN_ROLE + "\"");
sendRequest(new SubjectType[]{sbjct2}, new ResourceType[]{resTest1},
actionWrite, emptyEnv);
}

2. PEPは、PDP(セキュリティ・モジュール)へのトークンを含んだXACMLリクエストを送信します。
例6-27は、XACML認可リクエストの作成方法を示しています。

例6-27 XACMLリクエストの作成

private RequestType createRequest() throws XACMLException
{
// create resource
String res = "Library/LibraryResourceType/Book";
AttributeType attr = createAttribute(res, RESOURCE_ID, XML_STRING_TYPE);
ResourceType resource = new ResourceType(null, new AttributeType[]{attr});
// create action
String actionStr = "borrow";
attr = createAttribute(actionStr, ACTION_ID, XML_STRING_TYPE);
ActionType action = new ActionType(new AttributeType[]{attr});
// create environment
String isRegistered = input.getString("Is the user registered in the library (yes|no): ");
String numberOfBorrowedBooks = input.getString("How many books has the user borrowed already:: ");
EnvironmentType env;
List attrs = new ArrayList();
attrs.add(createAttribute(isRegistered, XACML_NAMESPACE + "RegisteredAttribute", XML_STRING_TYPE));
attrs.add(createAttribute(numberOfBorrowedBooks, XACML_NAMESPACE + "NumberOfBorrowedBooksAttribute", XML_STRING_TYPE));
// obligations
attrs.add(createAttribute(LIST_VAL1, XACML_NAMESPACE + ATTRIBUTE_NAME, XML_STRING_TYPE));
attrs.add(createAttribute(LIST_VAL2, XACML_NAMESPACE + ATTRIBUTE_NAME, XML_STRING_TYPE));
env = new EnvironmentType((AttributeType[])attrs.toArray(new AttributeType[attrs.size()]));
// subject
attr = createAttribute(identity.get_any(), SUBJECT_ID, XACML_NAMESPACE + OES_CREDENTIAL_TYPE);
SubjectType subject = new SubjectType(new AttributeType[]{attr}, null);
// now construct the request with subject, resource, action and environment.
return new RequestType(new SubjectType[]{subject},
new ResourceType[]{resource}, action, env);
}

例6-28は、XACML 2.0認可リクエストのサンプルです。SSM-SOAPWS_xacml.wsdlファイルは、操作インタフェースの定義を提供しています。

例6-28 XACML 2.0認可リクエスト

<Request xmlns="urn:oasis:names:tc:xacml:2.0:context:schema:os">
<Subject xsi:type="ns1:SubjectType" xmlns:ns1="urn:oasis:names:tc:xacml:2.0:context:schema:os"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Attribute AttributeId="urn:oasis:names:tc:xacml:1.0:subject:subject-id"
DataType="http://security.bea.com/ssmws/ssm-ws-1.0.wsdl#OESIdentityAssertion"
xsi:type="ns1:AttributeType">
<AttributeValue xsi:type="ns1:AttributeValueType">
<OESIdentityAssertion
xmlns="http://security.bea.com/ssmws/ssm-soap-types-1.0.xsd">
SU=John;TS=1288702235781;CT=1</OESIdentityAssertion>
</AttributeValue>
</Attribute>
</Subject>
<ns2:Resource xsi:type="ns2:ResourceType"
xmlns:ns2="urn:oasis:names:tc:xacml:2.0:context:schema:os"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns2:Attribute AttributeId="urn:oasis:names:tc:xacml:2.0:resource:resource-id"
DataType="http://www.w3.org/2001/XMLSchema#string"
xsi:type="ns2:AttributeType">
<ns2:AttributeValue xsi:type="ns2:AttributeValueType">
Library/LibraryResourceType/Book</ns2:AttributeValue>
</ns2:Attribute>
</ns2:Resource>
<ns3:Action xsi:type="ns3:ActionType"
xmlns:ns3="urn:oasis:names:tc:xacml:2.0:context:schema:os"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns3:Attribute AttributeId="urn:oasis:names:tc:xacml:1.0:action:action-id"
DataType="http://www.w3.org/2001/XMLSchema#string"
xsi:type="ns3:AttributeType">
<ns3:AttributeValue
xsi:type="ns3:AttributeValueType">borrow</ns3:AttributeValue>
</ns3:Attribute>
</ns3:Action>
<ns4:Environment xsi:type="ns4:EnvironmentType"
xmlns:ns4="urn:oasis:names:tc:xacml:2.0:context:schema:os"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns4:Attribute AttributeId=
"http://security.bea.com/ssmws/ssm-ws-1.0.wsdl#RegisteredAttribute"
DataType="http://www.w3.org/2001/XMLSchema#string"
xsi:type="ns4:AttributeType">
<ns4:AttributeValue xsi:type="ns4:AttributeValueType">yes</ns4:AttributeValue>
</ns4:Attribute>
<ns4:Attribute AttributeId=
"http://security.bea.com/ssmws/ssm-ws-1.0.wsdl
#NumberOfBorrowedBooksAttribute"
DataType="http://www.w3.org/2001/XMLSchema#string"
xsi:type="ns4:AttributeType">
<ns4:AttributeValue xsi:type="ns4:AttributeValueType">2</ns4:AttributeValue>
</ns4:Attribute>
</ns4:Environment>
</Request>

3. XACMLゲートウェイはトークンをアサートし、該当するアイデンティティに変換します。

4. Oracle Entitlements Serverは、該当するポリシーを使用してそのプリンシパルについての認可を決定し、XACMLレスポンスをPEPに返します。
例6-29は、XACML 2.0認可レスポンスのサンプルです。SSM-SOAPWS_xacml.wsdlファイルは、操作インタフェースの定義を提供しています。

例6-29 XACML 2.0認可レスポンス

<Response xmlns="urn:oasis:names:tc:xacml:2.0:context:schema:os">
<Result ResourceId="Library/LibraryResourceType/Book">
<Decision>Permit</Decision>
<Status>
<StatusCode Value="urn:oasis:names:tc:xacml:1.0:status:ok"/>
</Status>
<ns1:Obligations xmlns:ns1="urn:oasis:names:tc:xacml:2.0:policy:schema:os">
<ns1:Obligation ObligationId=
"http://security.bea.com/ssmws/ssm-ws-1.0.wsdl#Roles" FulfillOn="Permit">
<ns1:AttributeAssignment
DataType="http://www.w3.org/2001/XMLSchema#string"
AttributeId="http://security.bea.com/ssmws/ssm-ws-1.0.wsdl#role">
AuthenticatedUser</ns1:AttributeAssignment>
</ns1:Obligation>
<ns1:Obligation
ObligationId="http://security.bea.com/ssmws/ssm-ws-1.0.wsdl#
ResponseAttributes" FulfillOn="Permit">
<ns1:AttributeAssignment
DataType="http://www.w3.org/2001/XMLSchema#dateTime"
AttributeId="http://security.bea.com/ssmws/ssm-ws-1.0.wsdl#decisionTime">
2010-11-02T12:50:43.685Z</ns1:AttributeAssignment>
</ns1:Obligation>
</ns1:Obligations>
</Result>
</Response>

7 機能の拡張

Oracle Entitlements Serverランタイム環境に拡張クラスをロードすることで、基本機能を拡張できます。拡張機能はJavaアーカイブ(JAR)ファイルとしてバンドルされています。この章では、作成可能な拡張機能に関する次の項について説明します。

- 7.1項「属性リトリーバの使用」

- 7.2項「カスタム関数の開発」

7.1 属性リトリーバの使用

ポリシー情報ポイント(PIP)は、属性値のソースとして機能するシステムエンティティです。ポリシーの実行時評価の間に、Oracle Entitlements Serverは、属性リトリーバ・プラグインを利用して1つ以上のPIP情報ストアから属性値を取得します。これらの属性リトリーバにより、属性の値がアクセスの決定に影響するデータ・ドリブン方式でポリシーを使用できます。たとえば、銀行口座からの送金へのアクセスが現在口座にある金額に基づく場合、属性リトリーバ・コンポーネントを使用して現在の残高を取得できます。このインフラストラクチャは高い拡張性があり、ユーザーは独自のPIPプラグインを開発して、ファイル、USBドライバ、インターネットなど、多くの場所から情報を取得できます。

注意:

PIPの詳細な説明は、『Oracle Fusion Middleware Oracle Entitlements Server管理者ガイド』を参照してください。

詳細は、次の各項を参照してください。

- 7.1.1項「属性リトリーバについて」

- 7.1.2項「カスタム属性リトリーバの作成」

- 7.1.3項「カスタム属性リトリーバの実装」

- 7.1.4項「カスタム属性リトリーバに対するOracle Entitlements Serverの構成」

7.1.1 属性リトリーバについて

Oracle Entitlements Serverは事前定義済属性リトリーバを使用して、Lightweight Directory Access Protocol (LDAP)データ・ストアおよびリレーショナル・データベース管理システム(RDBMS)に接続します。別のタイプのPIPデータ・ストアから属性値を取得するためにカスタム属性リトリーバを開発することができます。カスタム属性リトリーバは、1つまたは多数の属性に値を返せます。

属性リトリーバの構成情報は、jps-config.xml構成ファイルで定義されます。このファイル内の属性リトリーバの構成は、事前定義済とカスタムによって異なります。

- 事前定義済属性リトリーバの場合:

- データ・ストアへの接続に必要な情報と資格証明情報を構成します。

- 属性名、使用する属性リトリーバの名前、値を取得する検索問合せ(たとえば、PIPがリレーショナル・データベースの場合はSQL問合せ、ディレクトリの場合はLDAP問合せ)、および属性値のキャッシング情報など、属性値を個別に構成します。

事前定義済属性リトリーバの詳細は、『Oracle Fusion Middleware Oracle Entitlements Server管理者ガイド』を参照してください。

- カスタム属性リトリーバの場合は、属性リトリーバを実装するクラスの名前に関する情報を構成します。

属性リトリーバは、単一の値または複数の値の属性を返すことができます。

注意:

jps-config.xml構成ファイルの詳細は、『Oracle Fusion Middlewareセキュリティ・ガイド』を参照してください。Oracle Entitlements Server固有のパラメータは、『Oracle Fusion Middleware Oracle Entitlements Server管理者ガイド』を参照してください。

7.1.2 カスタム属性リトリーバの作成

1.3.3項「条件の追加」の説明のとおり、ポリシーの条件は属性または関数を使用して作成します。条件に動的な属性値を使用する場合、属性をcom.bea.security.AppContextインタフェースで渡したり、事前定義済またはカスタム属性リトリーバで取得することができます。次の手順では、カスタム属性リトリーバの作成手順を説明します。

1. com.bea.security.providers.authorization.asi.AttributeRetrieverV2インタフェースを使用してカスタム属性リトリーバを実装します。
詳細は、7.1.3項「カスタム属性リトリーバの実装」を参照してください。

2. JARファイルを作成します。

3. 次のJARファイルを該当するクラスパスに追加します。

- Javaセキュリティ・モジュールへ接続する場合は、JARファイルをアプリケーションのクラスパスに追加します。

- RMI、WebサービスまたはWebLogic Serverセキュリティ・モジュールに接続する場合、他のセキュリティ・モジュールのJARファイルがあるシステムのクラスパスにJARファイルを追加します。

JARが物理的に格納されている場所は問題にはなりません。

4. カスタム属性リトリーバを使用するようにセキュリティ・モジュールを構成します。
構成では、カスタム属性リトリーバの完全修飾の場所を指定してください。『Oracle Fusion Middleware Oracle Entitlements Server管理者ガイド』のセキュリティ・モジュールの構成の付録を参照してください。

7.1.3 カスタム属性リトリーバの実装

カスタム属性リトリーバにはAttributeRetrieverV2インタフェースを実装する必要があります。表7-1はこの目的で使用可能なメソッドを説明しています。

表7-1 AttributeRetrieverV2インタフェースのメソッド

メソッド

説明

getAttributeValue()

特定の属性の値が要求されるたびに、このメソッドをコールします。指定された属性の値が返され、次のパラメータが取得されます。

- Nameは取得する属性の名前を定義します。

- RequestHandleは、(必要時に)他の属性の値を取得するインタフェースです。また、異なる属性リトリーバ間やカスタム関数間でのコンテキスト(任意のオブジェクト)の共有を可能にします。

- Subjectは、リクエストに関連付けられたユーザーを定義します。

- Rolesは、サブジェクトのロール・メンバーシップを定義します。また、ロール・マッピング・コールの場合はNULLになります。

- Resourceは、リクエストに関連付けられた保護されたリソースを定義します。

- contextHandlerは、リクエストに関連付けられたコンテキストです。存在しない場合はNULLになることがあります。

getHandledAttributeNames()

このメソッドは、多くの場合、属性リトリーバのロード時に1回コールします。このメソッドは、属性リトリーバが値を戻すことができる属性名のリストを返します。

最も単純な使用方法の場合、属性リトリーバは値の取得に追加情報を必要としません。たとえば、日中の時刻を取得する場合、getAttributeValue()はシステム関数をコールし、情報を返します。他の使用例では、属性リトリーバが属性値を返す前に、追加の情報を必要とする場合があります。たとえば、属性リトリーバはユーザーの場所を取得するためにユーザーの識別子を必要とします。このため、属性リトリーバには、他の属性の値を取得するためにRequestHandleインタフェースが提供されています。この例で、属性リトリーバはRequestHandleインタフェースを使用して組込みのSYS_USER属性の値を取得します。この値は現在のユーザーのアイデンティティに解決されます。

注意:

システム属性の名前は、%sys_user%のようにパーセント記号(%)で囲む必要があります。

次の各項では、属性取得オプションの詳細を説明します。

- 7.1.3.1項「属性値の直接取得」

- 7.1.3.2項「ハンドルを使用した属性値の取得」

7.1.3.1 属性値の直接取得

AttributeRetrieverV2の実装では、getAttributeValue()メソッドを使用して名前付き属性の値を返すことができます。このメソッドは、入力に属性の名前を取り、その属性の値を返します。例7-1では、getAttributeValue()の使用方法を示します。

例7-1 getAttributeValue()メソッドの実装

package oracle.security.oes.test;

import java.util.Map;

import javax.security.auth.Subject;

import weblogic.security.service.ContextHandler;
import weblogic.security.spi.Resource;

import com.bea.security.providers.authorization.asi.AttributeRetrieverV2;
import com.bea.security.providers.authorization.asi.ARME.evaluator.RequestHandle;

public class SimpleAttributeRetriever implements AttributeRetrieverV2 {

public Object getAttributeValue(String name, RequestHandle requestHandle,
Subject subject, Map roles, Resource resource,
ContextHandler contextHandler) {
if (name == null) return null;
return "static_value";
}

public String[] getHandledAttributeNames() {
return new String[] {"static_attr"};
}

}

MyAttributeRetrieverV2は、AttributeRetrieverV2の実装です。getHandledAttributeNames()メソッドは、この実装で処理される属性の名前を返します。少なくとも1つの属性を返します。空の値やNULL値は、リトリーバが任意の属性でコールされることを意味します。getAttributeValue()パラメータの値は次のように定義されています。

- nameは取得する属性の名前です。

- requestHandleは、(必要時に)他の属性の値を取得可能なインタフェースの実装です。また、異なる属性リトリーバ間やカスタム関数間でのコンテキスト(任意のオブジェクト)の共有を可能にします。使用されていない場合も関数に渡されます。

- subjectは、リクエストに関連付けられたプリンシパルを定義します。

- rolesは、関連付けられたプリンシパルのロール・メンバーシップを定義します。オブジェクトは、キーがロール名で、値がロール・オブジェクトのマップです。

- resourceは、リクエストに関連付けられた保護されたリソースです。

- contextHandlerは、リクエストに関連付けられたコンテキストを定義します。コンテキストが存在しない場合は、NULLになる場合があります。

7.1.3.2 ハンドルを使用した属性値の取得

状況によっては、属性リトリーバが必要な属性値を取得する前に、参考情報として属性の取得が必要になる場合があります。たとえば、属性リトリーバがユーザーの場所を取得するために、ユーザーの属性を必要とする場合があります。RequestHandleインタフェースのgetAttribute()メソッドを呼び出すことにより、属性リトリーバは識別子を取得でき、ユーザーのすべての情報にアクセスできます。getAttribute()メソッドは、AttributeElementオブジェクトの名前と値のペアとして属性名と値を返します。

RequestHandleは、必要時に他の属性の値を取得可能なインタフェースです。また、属性リトリーバやカスタム関数の異なる呼び出し間でコンテキスト(任意のオブジェクト)の共有を可能にします。

注意:

getAttribute()メソッドは、ユーザーとリソース属性の値を取得するために使用します。動的な属性や拡張属性の値を取得するために使用することはできません。

例7-2では、getAttribute()の使用方法を示します。

例7-2 getAttribute()メソッドの使用方法

public Object getAttributeValue
(String name, RequestHandle requestHandle, Subject subject,
Map roles, Resource resource, ContextHandler contextHandler) {

... ...

// retrieve sys_user built-in attribute
String user = null;
try {
AttributeElement element = requestHandle.getAttribute("sys_user", true);
if (element != null) {
user = (String)element.getValueAs(String.class);
}
} catch (Exception e) {
// ignore it
}

... ...
}

getAttribute()パラメータの値は次のように定義されています。

- sys_userは取得する属性の名前です。

- trueは、属性タイプのチェック機能を有効にします。タイプのチェックを無効にするために、この値をfalseにできます。

7.1.4 カスタム属性リトリーバに対するOracle Entitlements Serverの構成

この項では、カスタム属性リトリーバを認識するためにOracle Entitlements Serverを構成する手順を説明します。com.bea.security.providers.authorization.asi.AttributeRetrieverV2の実装後(7.1.3項「カスタム属性リトリーバの実装」で説明)、Javaコードをコンパイルし、コンパイルしたクラスをセキュリティ・モジュール・インスタンスのクラスパスに追加し、jps-config.xml構成ファイルに次の変更を加えます。

1. 例7-3に示すようにPIPサービス・プロバイダを<serviceProviders>セクションに宣言します。

例7-3 jps-config.xmlのserviceProvidersセクション

<serviceProviders>
<serviceProvider
class="oracle.security.jps.az.internal.runtime.provider.
PIPServiceProvider" name="pip.service.provider" type="PIP"/>
</serviceProviders>

2. 例7-4に示すようにPIPサービス・インスタンスを<serviceInstances>セクションに宣言します。

例7-4 jps-config.xmlのserviceProvidersセクション

<serviceInstances>
<serviceInstance name="pip.service.MyAttributeRetriever"
provider="pip.service.provider">
<property name="type" value="CUSTOM_PIP"/>
<property name="application" value="testPIPBasedOnCustomPIP"/>
<property name="description" value="MyAttributeRetriever"/>
<property name="classnames" value="pips.MyDummyAttributeRetriever"/>
</serviceInstance>
</serviceInstances>

次の表の定義に従ってプロパティを指定します。

名前

値

Type

値はCUSTOM_PIPにする必要があります。

Application

PIPインスタンスが適用されるアプリケーションです。

Classnames

カスタムPIPの完全修飾クラス名です。

3. 例7-5に示すようにPIPサービス・インスタンスを<jpsContext>セクションに宣言します。

例7-5 jps-config.xmlのjpsContextセクション

<jpsContext name="default">
<serviceInstanceRef ref="pip.service.MyAttributeRetriever"/>
</jpsContext>

7.2 カスタム関数の開発

関数は、ポリシーの条件で高度な処理を実行するために使用できます。関数は、いくつかのパラメータを取り、サポートされている任意のデータ型を戻すことができます。Oracle Entitlements Serverでは、いくつかの事前定義済関数が提供されており、さらに独自の関数を宣言できます。

カスタム関数は、クラス内にメソッドとして実装でき、メソッドには1つまたは複数のカスタム関数を含めることができます。メソッド名には、ポリシー内で参照している対応する名前と一致していれば、任意の名前を選択できます。カスタム関数は、定数や他の属性(動的属性を含む)または他の関数名で構成された引数を渡すことができます。すべての評価関数が共通のネームスペースを共有するため、2つの関数が同じ名前を持つことはできません。詳細は、次の各項を参照してください。

- 7.2.1項「カスタム関数の実装」

- 7.2.2項「メタデータ情報に対するInspectableFunctionの使用方法」

7.2.1 カスタム関数の実装

次の手順は、ポリシー内にカスタム関数を実装するときに行う詳細手順を示しています。

1. 関数のカスタム・コードを記述します。この項の例7-6と例7-7を参照してください。

2. Javaコードをコンパイルします。コンパイルされたクラスをセキュリティ・モジュールのクラスパスに追加します。

例7-6は、カスタム関数の作成方法を示しています。

例7-6 カスタム関数のサンプル・コード

package com.bea.security.examples;

import java.util.Map;
import java.util.Properties;

import javax.security.auth.Subject;

import weblogic.security.service.ContextHandler;
import weblogic.security.spi.Resource;

import com.bea.security.providers.authorization.asi.ARME.evaluator.RequestHandle;
import com.wles.util.AttributeElement;

public class MyEvaluationFunction {

/**named evaluation function. Additional authorization request data
is made available to allow for more complex attribute evaluation.
This method will be registered to ARME, and be invoked while the policy
contains a custom evaluation function with name "string_longer_then".
@param requestHandle the attributes container associated with the request,
through which the function can get required attribute value.
@param args an array of function arguments.
Each element is either <code>null</code>, or a String
@param subject the subject associated with the request
@param roles the role membership of the subject
key: role name.
value: role object
<code>null</code> if function is called during role mapping
@param resource the resource associated with the request
@param contextHandler the context associated with the request,
may be <code>null</code> if non-existant
@return <code>true</code> or <code>false</code> as the result of the function
@throws MissingAttributeException for can not get required attribute value.
*/
public boolean string_longer_then(RequestHandle requestHandle,
Object[] args,
Subject subject,
Map roles,
Resource resource,
ContextHandler contextHandler) {
// Check if we got a correct number of the input paramters
if(args.length < 2 || args.length > 3 ||
args[0] == null || args[1] == null) {
// Incorrect number of arguments.
// Such policy is invalid and can not be evaluated
throw new RuntimeException
("Incorrect number of arguments in a function");
}

// Arguments for an evalaution function are attribute names.
// Unfortunately, if a string literal or a numeric value is used
// it is passed in as value.  The only way to distinguish
// values from names is to try to look up the attribute.

// Evaluation function should not set any values.

// Get the integer value of the first argument.
// This example does not do any type error checking
// - but your code should.
int intCompLength = 0;
try {
AttributeElement strLength = requestHandle.getAttribute((String)args[0], true);
if(strLength != null) {
if(strLength.isList()) {
// string_longer_then: first argument not a single value
return false;
}
intCompLength = Integer.parseInt((String)strLength.getValueAs(String.class));
} else {
// numerical constant will be passed in as is.
try {
intCompLength = Integer.parseInt((String)args[0]);
} catch(NumberFormatException ne) {
//value format is error, and no attribute in requestHandle.
throw new RuntimeException("miss attribute: " + args[0]);
}
}
} catch(Exception e) {
//caught exception while get attribute
throw new RuntimeException(
"failed while get attribute: " + (String)args[0] + ". Exception: " + e.getMessage());
}

// Get the string value
String input = null;
try {
AttributeElement strContent = requestHandle.getAttribute((String)args[1], true);
if(strContent != null) {
if(strContent.isList()) {
// string_longer_then: second argument is not a single value
return false;
}
input = (String)strContent.getValueAs(String.class);
} else {
input = (String)args[1];
}
} catch(Exception e) {
//caught exception while get attribute
throw new RuntimeException(
"failed while get attribute: " + (String)args[0] + ". Exception: " + e.getMessage());
}

// return false, if the conditin is not satisfied
if(input.length() <= intCompLength) {
return false;
}

// Condition was satisfied.  Create and attach the return attribute

/* The method appendReturnData(String name, Object data) on RequestHandle object
does a copy of data.
Return value will only be appended if the rule
that called this function actually fired.
(other elements in the condition may prevent that)
*/
requestHandle.appendReturnData("cropped_string", input);
return true;
}

}

例7-7は、DataType引数を返すカスタム関数の作成方法を示しています。

例7-7 DataType引数を返すカスタム関数のサンプル・コード

import oracle.security.jps.service.policystore.info.DataType;
import oracle.security.jps.service.policystore.info.OpssString;

/**
Another example of evaluation function.
Additional authorization request data
is made available to allow for more complex attribute evaluation.
This method will be registered to ARME, and be invoked while the policy
contains a custom evaluation function with name "string_longer_then".
@param requestHandle the attributes container associated with the request,
through which the function can get required attribute value.
@param args an array of function arguments.
Each element is either <code>null</code>, or a String
@param subject the subject associated with the request
@param roles the role membership of the subject
key: role name.
value: role object
<code>null</code> if function is called during role mapping
@param resource the resource associated with the request
@param contextHandler the context associated with the request,
may be <code>null</code> if non-existant
@return <code>DataType</code> as the result of the function where
DataType is any of the out-of-the-box supported data typs such as
OpssDate/ OpssTime/ OpssString etc.
@throws MissingAttributeException for can not get required attribute value.
*/
public DataType string_to_upper_case(RequestHandle requestHandle,
Object[] args,
Subject subject,
Map roles,
Resource resource,
ContextHandler contextHandler)
throws MissingAttributeException {
// Check if we got a correct number of the input paramters
if((args.length != 1) || (args[0] == null)) {
// Incorrect number of arguments.
// Such policy is invalid and can not be evaluated
throw new RuntimeException
("Incorrect number of arguments in a function");
}

// Arguments for an evalaution function are attribute names.
// Unfortunately, if a string literal or a numeric value is used
// it is passed in as value.  The only way to distinguish
// values from names is to try to look up the attribute.

// Evaluation function should not set any values.

// Get the integer value of the first argument.
// This example does not do any type error checking
// - but your code should.
int intCompLength = 0;
try {
AttributeElement str = requestHandle.getAttribute((String)args[0], true);
String input = null;
if(str != null) {
if(str.isList()) {
// string_to_upper_case: first argument not a single value
return false;
}
input = (String)str.getValueAs(String.class);
} else {
// string constant will be passed in as is.
input = (String)args[0];
}
} catch(Exception e) {
//caught exception while get attribute
throw new RuntimeException(
"failed while get attribute: " + (String)args[0] + ". Exception: " + e.getMessage());
}

String output = input.toUpperCase();

return new OpssString(output);
}

詳細は、2.4.3.2項「カスタム関数の定義の作成」および2.4.5項「条件の定義」を参照してください。

7.2.2 メタデータ情報に対するInspectableFunctionの使用方法

引数メタデータのインタフェースは、カスタムOracle Entitlements Server関数が予期する引数についての情報を問い合せるために使用します。(これには、引数の数と、それらの名前および型などがあります。)オプションで、これらの引数問合せに対してInspectableFunctionインタフェースを実装できます。このインタフェースを基にカスタム関数を追加すると、管理コンソールはgetArgMetadataメソッドをコールして、引数を表すメタデータを返し、カスタム関数が予期するメタデータを検証します。

関数で予期される最初の引数(引数0)ごとに、getArgMetadataは引数を表すメタデータを返す必要があります。管理コンソールで予期される引数ごとのメタデータが収集されると、カスタムOracle Entitlements Server関数を使用するプロセスを自動化するために、インタフェース・メソッドのgetArgValueおよびisValidArgValueが使用されます。

- 例7-8に、getArgMetadata(String functionName)メソッドのサンプル・コードを示します。

- 例7-9に、getArgValues (String functionName, int argNumber, ArrayList<oracle.security.jps.service.policystore.info.DataType> prevArgValues)メソッドのサンプル・コードを示します。

- 例7-10に、isValidArgValue (String functionName, int argNumber, oracle.security.jps.service.policystore.info.DataType argValue, ArrayList<oracle.security.jps.service.policystore.info.DataType> prevArgValues)メソッドのサンプル・コードを示します。

例7-8 getArgMetadata()メソッドのサンプル・コード

public ArrayList<ArgMetadata> getArgMetadata (String functionName)
{
if (functionName.compareToIgnoreCase(Constants.GET_STRING_IDC_FUNC_NAME) == 0 ||
functionName.compareToIgnoreCase(Constants.GET_INTEGER_IDC_FUNC_NAME) == 0 ||
functionName.compareToIgnoreCase(Constants.GET_BOOLEAN_IDC_FUNC_NAME) == 0)
{
ArrayList<ArgMetadata> metadata = new ArrayList<ArgMetadata>();
metadata.add (new ArgMetadata (Constants.GET_IDC_FUNC_ARGS.CLAIM_NAME.ordinal(),
"Attribute", OpssString.class, true, false, true));
return metadata;
} else {
throw new RuntimeException ("Invalid function name " + functionName);
}
}

例7-9 getArgValues()メソッドのサンプル・コード

public ArrayList<oracle.security.jps.service.policystore.info.DataType>
getArgValues (String functionName, int argNumber,
ArrayList<oracle.security.jps.service.policystore.info.DataType> prevArgValues)

throws RuntimeException {

ArrayList<oracle.security.jps.service.policystore.info.DataType> values =
new ArrayList<oracle.security.jps.service.policystore.info.DataType>();

if (functionName.compareToIgnoreCase(Constants.GET_STRING_IDC_FUNC_NAME) == 0 ||
functionName.compareToIgnoreCase(Constants.GET_INTEGER_IDC_FUNC_NAME) == 0 ||
functionName.compareToIgnoreCase(Constants.GET_BOOLEAN_IDC_FUNC_NAME) == 0)
{
if (argNumber == Constants.GET_IDC_FUNC_ARGS.CLAIM_NAME.ordinal()) {

// return claims in the dictionary

Iterator<ClaimSchema> it = dictCtx.getDictionary().getClaimsForAllNamespaces();

while (it.hasNext()) {

if ((functionName.compareToIgnoreCase(Constants.GET_STRING_IDC_FUNC_NAME) ==
0 && it.next().getType() == String.class) ||

(functionName.compareToIgnoreCase(Constants.GET_INTEGER_IDC_FUNC_NAME) ==
0 && it.next().getType() == Integer.class) ||

(functionName.compareToIgnoreCase(Constants.GET_BOOLEAN_IDC_FUNC_NAME) ==
0 && it.next().getType() == Boolean.class))

{
nameList.add (it.next().getUniqueName());

}
}
Collections.sort(nameList);
for (String name : nameList)
values.add (new OpssString (name));

} else {

throw new RuntimeException ("Invalid argument number " + argNumber);

}

} else {

throw new RuntimeException ("Invalid function name " + functionName);
}
return values;
}

例7-10 isValidArgValue()メソッドのサンプル・コード

public boolean isValidArgValue (String functionName, int argNumber, oracle.security.jps.service.policystore.info.DataType argValue, ArrayList<oracle.security.jps.service.policystore.info.DataType> prevArgValues)

throws RuntimeException {

if (functionName.compareToIgnoreCase(Constants.GET_STRING_IDC_FUNC_NAME) == 0 ||

functionName.compareToIgnoreCase(Constants.GET_INTEGER_IDC_FUNC_NAME) == 0 ||

functionName.compareToIgnoreCase(Constants.GET_BOOLEAN_IDC_FUNC_NAME) == 0) {

if (argNumber == Constants.GET_IDC_FUNC_ARGS.CLAIM_NAME.ordinal())
{
// is it a valid claim?
try {
ClaimSchema schema = dictCtx.getDictionary().getClaimSchema(argValue.toString());
return ((functionName.compareToIgnoreCase(Constants.GET_STRING_IDC_FUNC_NAME)
== 0 && schema.getType() == String.class) ||
(functionName.compareToIgnoreCase(Constants.GET_INTEGER_IDC_FUNC_NAME)
== 0 && schema.getType() == Integer.class) ||
(functionName.compareToIgnoreCase(Constants.GET_BOOLEAN_IDC_FUNC_NAME)
== 0 && schema.getType() == Boolean.class));

} catch (UnknownClaimException e) {
return false;
}
} else {
throw new RuntimeException ("Invalid argument number " + argNumber);

}
} else {
throw new RuntimeException ("Invalid function name " + functionName);
}

}

8 JSP標準タグ・ライブラリの使用方法

JavaServer Pages Standard Tag Library(JSTL)は、繰り返し発生するタスクをカプセル化したJavaServer Pages(JSP)要素で構成されます。カスタム・タグはタスクを実装するオブジェクトを含んだ再使用可能なJSPコンポーネントです。これらは、タグ・ライブラリで配布されます。Oracle Entitlements Serverは、認可APIをコールするカスタム・タグを含んでいます。開発者は、JSPでこれらのタグを使用して、セキュリティベースのWebアプリケーションを作成できます。この章の次の各項では、カスタムOracle Entitlements Server JSPタグについて説明します。

- 8.1項「タグ・ライブラリの使用方法」

- 8.2項「機能タグの定義」

- 8.3項「アシスタント・タグの定義」

8.1 タグ・ライブラリの使用方法

JSTLの使用時、JSP内で次のようにディレクティブを定義する必要があります。

<%@ taglib uri="http://www.oracle.com/oes/utils/tags" prefix="oes" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

さらに、oestags.jarをクラスパスに追加します。oestags.jarは、セキュリティ・モジュールのインストール・フォルダ内のOES_CLIENT_HOME/oessm/oestags/ディレクトリ、またはOracle Entitlements Server管理サーバーのインストール・フォルダ内のOES_ADMIN_HOME/oes/oestags/ディレクトリにあります。

8.2 機能タグの定義

これらのJSPタグは、Oracle Entitlements Serverの認可機能を取得します。次の各項ではこれらの機能タグについて説明します。

- isAccessAllowedタグ

- isAccessNotAllowedタグ

- getUserRolesタグ

- isUserInRoleタグ

8.2.1 isAccessAllowedタグ

isAccessAllowedは、ユーザーに特定のリソースへのアクセスが認可されたかどうかを確認します。アクセスが許可された場合は、タグの本体が表示されます。許可されなかった場合は、本体がスキップされます。これはコオペラティブおよび条件タグです。trueまたはfalseと、義務の処理に使用可能な変数がJSPの本体へ返されます。

注意:

タグの本体によってJSPの内容を表示する場合は、then/elseタグを使用する必要があります。JSPの内容は、then/elseを使用しないかぎり、タグの本体で直接記述することはできません。

表8-1はisAccessAllowedタグの定義を示しています。

表8-1 isAcessAllowedタグの定義

名前

詳細

リソース

説明: isAccessAllowedをコールするときに使用するリソースです。

必須

戻り型: 該当なし

resourceType

説明: isAccessAllowedをコールするときに使用するリソースのタイプです。設定しない場合、setSecurityContextによって設定されるグローバル・リソース・タイプが使用されます。

オプション

戻り型: 該当なし

action

説明: isAccessAllowedをコールするときに使用するアクションです。デフォルトのアクションは表示です。

オプション

戻り型: 該当なし

resultVar

説明: アクセスが許可されたかどうかを通知するために使用するスクリプト変数の名前です。

オプション

戻り型: ブール

resultVarScope

説明: resultVarの範囲です(page、request、sessionまたはapplication)。デフォルトの範囲はpageです。

オプション

戻り型: 該当なし

obligationVar

説明: isAccessAllowedコールから義務を返すために使用する変数の名前です。

オプション

戻り型: 義務のマップ。キーは義務の名前で、値は、属性名と値による属性のマップです。

obligationVarScope

説明: isAccessAllowedからの義務を含む変数の範囲です(page、request、sessionまたはapplication)。デフォルトの範囲はpageです。

オプション

戻り型: 該当なし

例8-1では、isAccessAllowedの使用方法を示します。

例8-1 isAccessAllowedタグの例

<%-- Set global attributes --%>
<oes:setSecurityContext appId="TagLibraryApp" resourceType="image"
resourcePrefix="images/">
<oes:attribute name="test_attr" value="good_job"/>
</oes:setSecurityContext>

<%!
String resourceStr="private.jpg";
String actionStr="read";
String returnVar = "isAllowed";
%>

<%-- Test for isAccessAllowed tag --%>
<oes:isAccessAllowed  resource="<%=resourceStr %>" action="<%=actionStr %>"
resultVar="<%=returnVar %>" obligationVar="obligations">
<oes:attribute name="test_attr_local" value="hard_work" />
<oes:then>
You have the permission to <%=actionStr %> the image <%=resourceStr %>.
<br/>
<img src="images/private.jpg"  width="250" height="150" /> <br/>
The obligations are: <br/>
<c:forEach items="${obligations}" var="entry">
<c:out value="${entry.key}" /> &nbsp;=&nbsp; <c:out
value="${entry.value}" /> <br/>
</c:forEach>
</oes:then>
<oes:else>
You have not the permission to <%=actionStr %> the image
<%=resourceStr %>. <br/>
</oes:else>
</oes:isAccessAllowed>

<%-- another way to use tag isAccessAllowed --%>
<oes:isAccessAllowed  resource="<%=resourceStr %>" action="<%=actionStr %>"
resultVar="<%=returnVar %>" obligationVar="obligations">
<oes:attribute name="test_attr_local" value="hard_work" />
</oes:isAccessAllowed>
<c:choose>
<c:when test="${isAllowed}">You have the permission to <%=actionStr %>
the image <%=resourceStr %>. <br/>
<img src="images/private.jpg"  width="250" height="150" />
The obligations are: <br/>
<c:forEach items="${obligations}" var="entry">
<c:out value="${entry.key}" /> &nbsp;=&nbsp;
<c:out value="${entry.value}" /> <br/>
</c:forEach>
</c:when>
<c:otherwise>
You have not the permission to <%=actionStr %> the image
<%=resourceStr %>. <br/>
</c:otherwise>
</c:choose>

8.2.2 isAccessNotAllowedタグ

isAccessNotAllowedは、ユーザーに特定のリソースへのアクセスが認可されなかったかどうかを確認します。アクセスが許可されなかった場合は、タグの本体が表示されます。許可された場合は、本体がスキップされます。これはコオペラティブおよび条件タグです。trueまたはfalseと、後から義務の処理に使用可能な変数がJSPの本体へ返されます。

注意:

タグの本体によってJSPの内容を表示する場合は、then/elseタグを使用する必要があります。JSPの内容は、then/elseを使用しないかぎり、タグの本体で直接記述することはできません。

表8-2はisAccessNotAllowedタグの定義を示しています。

表8-2 isAccessNotAllowedタグの定義

名前

詳細

リソース

説明: isAccessAllowedをコールするときに使用するリソースです。

必須

戻り型: 該当なし

resourceType

説明: isAccessAllowedをコールするときに使用するリソースのタイプです。設定しない場合、setSecurityContextによって設定されるグローバル・リソース・タイプが使用されます。

オプション

戻り型: 該当なし

action

説明: isAccessAllowedをコールするときに使用するアクションです。デフォルトのアクションは表示です。

オプション

戻り型: 該当なし

resultVar

説明: アクセスが許可されたかどうかを通知するために使用するスクリプト変数の名前です。

オプション

戻り型: ブール

resultVarScope

説明: resultVarの範囲です(page、request、sessionまたはapplication)。デフォルトの範囲はpageです。

オプション

戻り型: 該当なし

obligationVar

説明: isAccessAllowedコールから義務を返すために使用する変数の名前です。

オプション

戻り型: 義務のマップ。キーは義務の名前で、値は、属性名と値による属性のマップです。

obligationVarScope

説明: isAccessAllowedからの義務を含む変数の範囲です(page、request、sessionまたはapplication)。デフォルトの範囲はpageです。

オプション

戻り型: 該当なし

例8-2では、isAccessNotAllowedの使用方法を示します。

例8-2 isAccessNotAllowedタグの例

<%-- Test for isAccessNotAllowed tag --%>
<oes:isAccessNotAllowed  resource="<%=resourceStr %>"
action="<%=actionStr %>" resultVar="isNotAllowed"
obligationVar="obligations_not">
<oes:then>
You have not the permission to <%=actionStr %> the image <%=resourceStr %>.
<br/>
The obligations are: <br/>
<c:forEach items="${obligations_not}" var="entry">
<c:out value="${entry.key}" /> &nbsp;=&nbsp;
<c:out value="${entry.value}" /> <br/>
</c:forEach>
</oes:then>
<oes:else>
You have the permission to <%=actionStr %> the image <%=resourceStr %>.
<br/>
<img src="images/private.jpg" width="250" height="150"/>
The obligations are: <br/>
<c:forEach items="${obligations_not}" var="entry">
<c:out value="${entry.key}" /> &nbsp;=&nbsp;
<c:out value="${entry.value}" /> <br/>
</c:forEach>
</oes:else>
</oes:isAccessNotAllowed>

<%-- another way to use tag isAccessNotAllowed --%>
<oes:isAccessNotAllowed  resource="<%=resourceStr %>"
action="<%=actionStr %>" resultVar="isNotAllowed"
obligationVar="obligations_not" />
<c:choose>
<c:when test="${isNotAllowed}">You have not the permission to
<%=actionStr %> the image <%=resourceStr %>. <br/>
</c:when>
<c:otherwise>
You have the permission to <%=actionStr %> the image <%=resourceStr %>. <br/>
<img src="images/private.jpg"  width="250" height="150" />
The obligations are: <br/>
<c:forEach items="${obligations}" var="entry">
<c:out value="${entry.key}" /> &nbsp;=&nbsp;
<c:out value="${entry.value}" /> <br/>
</c:forEach>
</c:otherwise>
</c:choose>

8.2.3 getUserRolesタグ

getUserRolesは、特定のリソースとアクションに割り当てられたロールを取得します。これは、後からの処理に使用可能な変数をJSPに返すコオペラティブタグです。表8-3はgetUserRolesタグの定義を示しています。

表8-3 getUserRolesタグの定義

名前

詳細

リソース

説明: getUserRolesをコールするときに使用するリソース。

必須

戻り型: 該当なし

resourceType

説明: getUserRolesをコールするときに使用するリソースのタイプ。設定しない場合、setSecurityContextによって設定されるグローバル・リソース・タイプが使用されます。

オプション

戻り型: 該当なし

action

説明: getUserRolesをコールするときに使用するアクション。デフォルトのアクションは表示です。

オプション

戻り型: 該当なし

resultVar

説明: ユーザーのロールのリストを含めるように設定する変数の名前。

必須

戻り型: ロール名の文字列のリスト。

resultVarScope

説明: resultVarの範囲です(page、request、sessionまたはapplication)。デフォルトの範囲はpageです。

オプション

戻り型: 該当なし

例8-3では、getUserRolesの使用方法を示します。

例8-3 getUserRolesタグの例

<%-- Test for tag getUserRoles --%>
<oes:setSecurityContext appId="TagLibraryApp" resourceType="jspfile"
resourcePrefix="">
<oes:attribute name="myroleattr" value="its_my_role"/>
</oes:setSecurityContext>
<oes:getUserRoles  resource="protected/rolepolicy.jsp" action="write"
resultVar="rolenames" />
<c:out value="Role names are : " />
<c:forEach items="${rolenames}" var="rolename">
<c:out value="${rolename}" /> <br>
</c:forEach>

8.2.4 isUserInRoleタグ

isUserInRoleは、ユーザーが、特定のリソースとアクションの指定されたロールに割り当てられているかどうかをチェックします。これはコオペラティブおよび条件タグです。true(現在のユーザーに特定のロールがある場合)またはfalseと、後からの処理のために結果変数がJSPの本体に返されます。

注意:

タグの本体によってJSPの内容を表示する場合は、then/elseタグを使用する必要があります。JSPの内容は、then/elseを使用しないかぎり、タグの本体で直接記述することはできません。

表8-4はisUserInRoleタグの定義を示しています。

表8-4 isUserInRoleタグの定義

名前

詳細

ロール

説明: ユーザーに対してチェックするロールの名前。

必須

戻り型: 該当なし

リソース

説明: ユーザーのロールをチェックするリソースの名前。

必須

戻り型: 該当なし

resourceType

説明: ユーザーのロールをチェックするリソースのタイプ。設定しない場合、setSecurityContextによって設定されるグローバル・リソース・タイプが使用されます。

オプション

戻り型: 該当なし

action

説明: ユーザーのロールをチェックするリソースのアクション。デフォルト値はviewになります。

オプション

戻り型: 該当なし

resultVar

説明: isUserInRoleからの結果を後から使用するために保持する変数。

オプション

戻り型: ブール

resultVarScope

説明: resultVarの範囲です(page、request、sessionまたはapplication)。デフォルトの範囲はpageです。

オプション

戻り型: 該当なし

例8-4では、isUserInRoleの使用方法を示します。

例8-4 isUserInRoleタグの例

<%-- Test for tag isUserInRole --%>
<oes:isUserInRole role="tagrole1" resource="protected/rolepolicy.jsp"
action="write" resultVar="isUserInRole" resultVarScope="request">
<oes:then>You are in the role "tagrole1".</oes:then>
<oes:else>You are not in the role "tagrole1".</oes:else>
</oes:isUserInRole>

<%-- we can also use following scripts to test if the user is in the specific
role --%>
<c:choose>
<c:when test="${isUserInRole}">
<iframe src="protected/rolepolicy.jsp?isUserInRole=<c:out
value='${isUserInRole}'/>" width="500" height="250" />
</c:when>
<c:otherwise>
You are not in role "tagrole1", and can not see the content of
protected/rolepolicy.jsp
</c:otherwise>
</c:choose

8.3 アシスタント・タグの定義

アシスタント(非機能とも呼びます)タグは、ヘルパー・タグです。次の各項ではこれらのアシスタント・タグについて説明します。

- setSecurityContextタグ

- attributeタグ

- then/elseタグ

8.3.1 setSecurityContextタグ

setSecurityContextは、指定されたページ範囲でデータ(アプリケーションID、リソース・タイプ、他のタグのリソース名の接頭辞など)を設定するコオペレーティブ・タグです。アプリケーションのコンテキストでグローバルに設定する必要がある属性は、このタグの本体でattributeタグ(8.3.2項「attributeタグ」を参照)を使用して設定できます。setSecurityContextに設定された属性は、認可コール要素に従って、アプリケーション・コンテキスト内に配置されます。表8-5はsetSecurityContextタグの定義を示しています。

表8-5 setSecurityContextタグの定義

名前

詳細

appId

説明: セキュリティ・コンテキストのappId。リソース属性を持つページ上の他のすべてのタグにランタイム・リソースを作成するために使用されます。

必須

戻り型: 該当なし

resourceType

説明: 他のすべての認可タグによって使用可能なグローバル・リソース・タイプ。

オプション

戻り型: 該当なし

resourcePrefix

説明: リソース名の接頭辞。1つのJSPにある大半のリソースの接頭辞が同じ場合、この属性を使用して各認可タグのリソース名を短縮できます。たとえば、/product/cat1/images/にある多数のイメージが認可ポリシーによって保護されている場合、接頭辞を/product/cat1/images/に設定して、リソース名をmobile.jpgのように単純.なイメージ名にできます。

オプション

戻り型: 該当なし

例8-5では、setSecurityContextの使用方法を示します。

例8-5 setSecurityContextタグの例

<%-- Set global attributes --%>
<oes:setSecurityContext appId="TagLibraryApp" resourceType="image"
resourcePrefix="images/">
<oes:attribute name="test_attr" value="good_job"/>
</oes:setSecurityContext>

8.3.2 attributeタグ

attributeは、他のOracle Entitlements Server JSPタグによってOracle Entitlements Serverアプリケーション・コンテキストに追加の変数を渡すために使用できるタグです。それらの変数は、認可ポリシーに対して制約を書き込むために使用されます。表8-6はattributeタグの定義を示しています。

表8-6 attributeタグの定義

名前

詳細

name

説明: アプリケーション・コンテキストで設定する属性の名前。

必須

戻り型: 該当なし

value

説明: アプリケーション・コンテキストで設定する値の名前。

必須

戻り型: 該当なし

例8-6では、attributeの使用方法を示します。

例8-6 attributeタグの例

<oes:attribute name="myroleattr" value="its_my_role"/>

8.3.3 then/elseタグ

then/elseは、条件タグ(isAccessAllowed、isAccessNotAllowed、isUserInRoleなど)の内容を表示するために使用します。条件タグの結果がtrueの場合、thenタグの内容が表示されます。falseの場合、elseタグの内容が表示されます。これらのタグは追加の定義がない単純なタグです。

索引

A  B  C  D  E  F  G  H  I  J  M  N  O  P  R  S  T  U  V  X

A

アクション

追加, 2.3.5

ポリシー, 1.2

詳細なコンポーネントの追加, 1.3 管理

委任, 5.1

管理ロール, 5, 5.1

ApplicationPolicyAdmin, 5.4

プリンシパルの割当て, 5.5.3

作成, 5.5, 5.5.1

デフォルト, 5.4

定義, 5.1

管理, 5.3

管理, 5.6

PolicyDomainAdmin, 5.4

システム, 5.2

SystemAdmin, 5.4

表示, 5.3

管理者

アプリケーション・ポリシー, 5.2

ポリシー・ドメイン, 5.2

AdminManager, 5.5.1 AdminResourceActionEntry, 5.5.2 adminRole, 5.5.1 AdminRoleEntry

管理, 5.6

拡張ポリシー, 1.3 拡張ポリシー要素, 1.3 アプリケーション

「ApplicationPolicy」を参照, 2.3.2

アプリケーション・オブジェクト, 1.2 アプリケーション・ポリシー

管理者, 5.2

作成, 2.3.2

アプリケーション・ロール・オブジェクト, 2.4.1 アプリケーション・ロール

作成, 1.3.1

階層, 2.4.1

管理, 3.2.2.3

ApplicationPolicy, 1.2

セキュリティ・モジュールへのバインド, 4.3

作成, 2.3.2

管理, 3.2.1

範囲レベル, 3.2

ApplicationPolicyAdmin管理ロール, 5.4 AppRoleEntry, 1.3.1, 2.4.1

管理, 3.2.2.3

AppRoleManager, 1.3.1 属性リトリーバ, 7.1

およびjps-config.xml, 7.1.1

カスタム, 7.1.2

attributeタグ, 8.3.2 AttributeEntry, 1.3.3, 2.4.3.1

管理, 3.2.2.5.1

AttributeRetrieverV2インタフェース, 7.1.2

実装, 7.1.3

属性

拡張, 2.4.3

認可ポリシー

およびロール・マッピング・ポリシー, 2.4.2, 3.2.2.3

B

BasicPolicyRuleEntry, 2.3.6

バインド

セキュリティ・モジュール, 4.3

SMEntry, 4.3.2

ブール

resourceActionOnly, 6.1.2.5

ブール式

制約, 2.4.5.1

BooleanExpressionEntry, 2.4.5

C

cascadeDelete, 3.2.2.2

checkPermission()

コール, 6.2

比較演算子, 2.2 複雑な検索, 2.1.4 制約, 2.4.5

追加、1.3.3

ブール式, 2.4.5.1

ファンクション式, 2.4.5.2

制御された配布, 4.2.1 制御されたプル配布, 4.2.1 制御されたプッシュ配布, 4.2.1 createメソッド

概要, 2.1.1

カスタム属性リトリーバ, 7.1.2 カスタム関数, 7.2

D

データ型, 2.2

デフォルトの管理ロール, 5.4

委任管理

概要, 5.1

範囲, 5.2

deleteメソッド

概要, 2.1.2

deleteRolePolicy(), 3.2.2.4 分散モード, 4.2

制御, 4.2.1

非制御, 4.2.2

動的属性, 2.4.3.1

E

資格, 1.3.4

拡張, 1.3.3

ExtensionManager, 1.3.3

拡張子

属性, 2.4.3

機能, 2.4.3

管理, 3.2.2.5.1, 3.2.2.5.2

F

詳細な要素, 2.4

詳細なポリシー, 1.3

ファンクション式

制約, 2.4.5.2

FunctionEntry, 1.3.3, 2.4.3.2

管理, 3.2.2.5.2

関数

拡張, 2.4.3

G

ゲートウェイ

XACML, 6.3

getGrantedAdminResources, 5.5.4 getRolePolicy(), 3.2.2.4 getSecurityContextタグ, 8.3.1 getUserRolesタグ, 8.2.3 grantAdminRole, 5.5.3 粒度

管理の委任, 5.2

H

階層型リソース, 2.3.3, 2.3.4

階層

アプリケーション・ロール, 2.4.1

I

InspectableFunction, 7.2, 7.2.2

isAccessAllowedタグ, 8.2.1

isAccessNotAllowedタグ, 8.2.2

isUserInRoleタグ, 8.2.4

J

Java API

createメソッド, 2.1.1

deleteメソッド, 2.1.2

マネージャ・インタフェース, 2.1

modifyメソッド, 2.1.2

ポリシー・オブジェクト, 2.1

検索問合せ, 2.1.4

jps-config.xml, 2.3.1

および属性リトリーバ, 7.1.1

JSPタグ

「タグ」を参照, 8

M

管理権限, 5.3

管理

範囲, 3.2

マネージャ・インタフェース, 2.1 管理

SMEntry, 4.3.1

modifyメソッド

概要, 2.1.2

modifyRolePolicy(), 3.2.2.4

N

制御されない配布, 4.2.2

O

オブジェクト

PermissionSetEntry, 1.3.4

オブジェクト

AdminResourceActionEntry, 5.5.2

adminRole

作成, 5.5.1

AdminRoleEntry, 5.6 ApplicationPolicy, 1.2, 2.3.2

管理, 3.2.1

AppRoleEntry, 1.3.1, 2.4.1

管理, 3.2.2.3

AttributeEntry, 1.3.3, 2.4.3.1

管理, 3.2.2.5.1

FunctionEntry, 1.3.3, 2.4.3.2

管理, 3.2.2.5.2

管理

PolicyStore, 3.2.1

ObligationEntry, 1.3.5, 2.4.6 PermissionSetEntry, 2.4.4

管理, 3.2.2.7

PolicyDomainEntry, 1.2

作成, 5.7

管理, 3.2.2.1, 3.2.3

PolicyEntry, 1.2, 2.3.8

管理, 3.2.2.8

PolicyRuleEntry, 2.3.6, 2.3.6 PolicyStore, 1.2, 2.3.1, 3.2 PrincipalEntry, 2.3.7 ResourceActionsEntry, 1.2, 2.3.5 ResourceEntry, 1.2, 2.3.4

管理, 3.2.2.6

ResourceTypeEntry, 1.2, 2.3.3

管理, 3.2.2.2

RolePolicyEntry, 3.2.2.4 RuleExpressionEntry, 2.4.5 SMEntry, 4.3

バインド, 4.3.2

管理, 4.3.1

義務

作成, 1.3.5

義務オブジェクト, 2.4.6 ObligationEntry, 1.3.5, 2.4.6 義務, 2.4.6

P

PEP API

コール, 6.1

権限セット

管理, 3.2.2.7

権限セット

移入, 1.3.4

権限セット・オブジェクト, 2.4.4 PermissionSetEntry, 1.3.4, 2.4.4

管理, 3.2.2.7

PIP

および属性リトリーバ, 7.1

ポリシー

アクション, 1.2

拡張要素の追加, 2.4

詳細な要素の追加, 1.3

およびロール, 1.4

作成, 1.2

コンポーネント, 1.1

単純なものの構成, 1.2

統合, 2.3.8

制約, 1.3.3

単純なものの実行, 2.3

管理, 3.2.2.8, 3.2.3

義務, 1.3.5

ポリシー配布

初期化, 4.4

概要, 4.1

ポリシー・ドメイン

管理者, 5.2

作成, 5.7

デフォルト, 1.2

管理, 3.2.2.1

ポリシー・オブジェクト

およびAPI, 2.1

ポリシー・ルール, 2.3.6 ポリシーの単純なコンポーネント, 1.2 ポリシー・ストア, 1.2

アクセス, 2.3.1

定義中, 3.2

PolicyDomainAdmin管理ロール, 5.4 PolicyDomainEntry, 1.2

作成, 5.7

管理, 3.2.2.1, 3.2.3

範囲レベル, 3.2

PolicyEntry, 1.2

統合, 2.3.8

管理, 3.2.2.8

PolicyManager, 3.2.2.8 PolicyRuleEntry, 1.2, 2.3.6 PolicyStore, 1.2

アクセス, 2.3.1

定義中, 3.2

オブジェクトの管理, 3.2.1

プリンシパル, 2.3.7 PrincipalEntry, 1.2, 2.3.7 プリンシパル

割当て, 5.5.3

リソースの取得, 5.5.4

権限

割当て, 5.5.2

管理, 5.3

表示, 5.3

プル(ポリシー配布), 4.2.1 プッシュ(ポリシー配布), 4.2.1

R

RBAC

および管理の委任, 5.1

リソース

インスタンス化, 2.3.4

管理, 3.2.2.6

リソース属性, 2.4.3.1 リソース属性, 2.3.3 リソース・オブジェクト, 1.2 リソース・タイプ

作成, 2.3.3

管理, 3.2.2.2

リソース・タイプ・オブジェクト, 1.2 resourceActionOnly, 6.1.2.5 ResourceActionsEntry, 1.2, 1.2

作成, 2.3.5

ResourceEntry, 1.2, 1.2

階層型, 2.3.3, 2.3.4

インスタンス化, 2.3.4

管理, 3.2.2.6

ResourceManager, 1.2 ResourceTypeEntry, 1.2

作成, 2.3.3

階層型, 2.3.3, 2.3.4

管理, 3.2.2.2

ResourceTypeManager, 1.2 ロール・カタログ, 2.4.1, 3.2.2.3 ロール・カテゴリ, 3.2.2.3 ロール・マッピング・ポリシー, 2.4.1, 3.2.2.3

および認可ポリシー, 2.4.2, 3.2.2.3

管理, 3.2.2.4

概要, 1.3.2

ロール

ポリシーの実装, 1.4

RuleExpressionEntry, 2.4.5

S

有効範囲

管理の委任, 5.2

範囲レベル, 3.2

ApplicationPolicy, 3.2

PolicyDomainEntry, 3.2

検索問合せ

概要, 2.1.4

シンプルおよび複合, 2.1.4

セキュリティ・モジュール

ApplicationPolicyへのバインド, 4.3

単純なポリシー, 1.2, 2.3 簡易検索, 2.1.4 SMEntry

バインド, 4.3.2

管理, 4.3.1

システム管理者, 5.2 SystemAdmin管理者ロール, 5.4

T

タグ, 8

属性, 8.3.2

getSecurityContext, 8.3.1

getUserRoles, 8.2.3

isAccessAllowed, 8.2.1

isAccessNotAllowed, 8.2.2

isUserInRole, 8.2.4

then/else, 8.3.3

then/elseタグ, 8.3.3

U

使用例

属性リトリーバ, 7.1.1

V

ビューに対する権限, 5.3

X

XACMLゲートウェイ, 6.3

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