| Oracle® Fusion Middleware Oracle Entitlements Server開発者ガイド 11gリリース2 (11.1.2.3) E67355-01 |
|
![]() 前 |
![]() 次 |
Oracle Entitlements Serverには、ポリシーやポリシー・オブジェクトをプログラムによって作成するためのJavaアプリケーション・プログラミング・インタフェース(API)が含まれています。この章では、それらの様々なポリシー・オブジェクトをAPIを使用して作成する方法について説明します。
内容は次のとおりです。
|
注意: 対応するWebLogic Scripting Tool (WLST)コマンドは、『Oracle Fusion Middleware Oracle Entitlements Server管理者ガイド』を参照してください。 |
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などが含まれています。ポリシー・オブジェクトを作成または管理するには、次の操作を行う必要があります。
ポリシー・ストアへのハンドルを取得します。
2.3.1項「ポリシー・ストアへのアクセス」を参照してください。
オブジェクトを作成する(または作成済の)アプリケーション・ポリシーを取得します。
2.3.2項「アプリケーション・ポリシーの作成」を参照してください。
適切なエンティティ管理インタフェースのインスタンスを取得します。エンティティ・マネージャを使用してポリシー・オブジェクトを作成および管理します。
oracle.security.jps.service.policystore.entitymanagerパッケージには、ResourceManager、PolicyManager、AppRoleManager、PermissionSetManagerなど、すべてのインタフェースが含まれています。
次の項では、ポリシー・オブジェクトに対して特定の操作を実行するためにどのようにAPIを使用できるかをより具体的に説明します。
詳細は、次のいずれかまたは両方のOracle Entitlements Server Java APIリファレンス・ガイドを参照してください。
Oracle Fusion Middleware Oracle Entitlements Server管理Java APIリファレンス
Oracle Fusion Middleware Oracle Entitlements Server PDP拡張Java APIリファレンス
特定のポリシー・オブジェクトを作成するには、ポリシー・ストアと該当するエンティティ・マネージャ・インタフェースのインスタンスへのハンドルを取得して、createメソッドを使用します。ポリシー・オブジェクトには、Name、Display Name、Descriptionなどの共通の要素があり、作成時にはこれらを定義する必要があります。作成しているオブジェクトの型固有のその他の要素も定義する必要があります。createメソッドの例とパラメータの説明は、2.3項「単純なポリシーの実行」および2.4項「単純なポリシー用の詳細な要素の作成」を参照してください。
特定のポリシー・オブジェクトを変更するには、ポリシー・ストアへのハンドルを取得して、新しいオブジェクトを作成するか、既存のものを検索してオブジェクトを取得します。オブジェクトのインスタンスはメモリー内に配置されます。オブジェクトのメソッドを使用して、メモリー内インスタンスを変更します。必要に応じて1つ以上をコールできます。変更が完了したら、オブジェクトのManagerインタフェースのインスタンスを取得して、modifyメソッドを使用し、メモリー内オブジェクトへの参照を渡します。これにより、ポリシー・ストア内のオブジェクト自体に変更が伝播されます。これらの操作の例とパラメータの説明は、第3章「プログラムによるポリシー・オブジェクトの構成」を参照してください。
ポリシー・オブジェクトを削除するには、ポリシー・ストアと、該当するエンティティ・マネージャ・インタフェースのインスタンスへのハンドルを取得します。オブジェクトの定義済の名前をマネージャのdeleteメソッドに渡して削除します。また、一部のオブジェクトはカスケード削除が可能です。詳細は、第3章「ポリシー・オブジェクトのプログラムによる管理」を参照してください。
ポリシー定義で参照するポリシー・オブジェクトの取得には、しばしば検索が必要になります。ポリシー・オブジェクトを検索するには、単純な問合せまたは複雑な問合せを使用します。各Managerインタフェースには、問合せのタイプごとに単数または複数のgetメソッドがあります。単数のgetメソッドでは、オブジェクトの定義済の名前を渡すことで特定のポリシー・オブジェクトを検索および取得できます。複数のgetメソッドは、複雑な問合せを使用して複数のオブジェクトを取得するために使用します。複数のgetメソッドの場合は、oracle.security.jps.service.policystore.searchに定義されているSearchQueryクラスを使用して検索基準を渡します。表2-1は、標準のSearchQueryクラスのパラメータおよび説明を示しています。
表2-1 複雑なSearchQueryパラメータの使用方法
| パラメータ | 説明 |
|---|---|
|
policy_object |
問合せを実行するために使用するプロパティが定義された列挙。オブジェクト・タイプに応じて名前、表示名、説明などを格納できます。特定の検索タイプで許可されたプロパティは、Java APIリファレンスを参照してください。 |
|
negation |
値に |
|
operator |
|
|
search string |
検索に使用される文字列の値を取得します。
|
|
|
検索文字列を検索対象の値と一致させる方法を定義する列挙です。次のいずれかを定義する必要があります。
|
これらの検索操作の詳細は、第3章「ポリシー・オブジェクトのプログラムによる管理」を参照してください。特定のポリシー・オブジェクト固有のSearchQueryパラメータ情報についてはOracle Entitlements Server Java APIリファレンスを参照してください。
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エンコード・バイナリ・データを表します。 |
|
BOOLEAN |
trueまたはfalseを表します。 |
|
DATE |
整数値化された年、月、日、時間および分のプロパティ、小数値化された2番目のプロパティおよびブール値のタイムゾーン・プロパティによってオブジェクトとして表示可能な値です。 |
|
DATE_TIME |
整数値化された年、月、日、時間および分のプロパティ、小数値化された2番目のプロパティおよびブール値のタイムゾーン・プロパティによってオブジェクトとして表示可能な値です。 |
|
DAYTIME_DURATION |
座標系にグレゴリオ暦の年、月、日、時、分および秒の要素が指定されたオブジェクトとして時間間隔を表します。 |
|
DNS_NAME |
ドメイン・ネームサービス(DNS)ホストの名前と、オプションのポートまたはポートの範囲を表します。 |
|
DOUBLE |
IEEE倍精度64ビット浮動小数点型を表します。 |
|
HEX_BINARY |
任意の16進エンコード・バイナリ・データを表します。 |
|
INTEGER |
有限長の10進数桁とオプションの先頭符号を表します。符号を省略した場合、正の数値が仮定されます。 |
|
IP_ADDRESS |
インターネット・プロトコル(IP)・アドレスを表します。 |
|
RFC822_NAME |
電子メール・アドレスを表します。 |
|
STRING |
文字列を表します。 |
|
TIME |
特定の毎日繰り返す時刻を表します。PDPが制約または義務に指定された時刻を評価するとき、PDPがデプロイされたホストのローカル時間として解釈されます。 |
|
X500_NAME |
識別名(DN)を表します。 |
|
YEARMONTH_DURATION |
時間間隔を表します。年数と月数を格納可能です。 |
これらのデータ型は、次の用途に使用できます。
データ型を属性(動的属性、リソース属性、カスタム属性リトリーバによって取得されたカスタム属性)に割り当てることによる属性の宣言
ポリシー・ルールの制約
義務内での値の戻し
入力パラメータ
顧客/組込み関数の戻り値の宣言
表2-3に、各データ型で使用できる関数のカテゴリを示します。
表2-3 データ型に対する関数のカテゴリ
| 関数のカテゴリ | 説明 |
|---|---|
|
ARITHMETIC_FUNCTION |
IntegerまたはDoubleデータ型の2つの引数を取得し、IntegerまたはDoubleデータ型を返します。 |
|
BAG_FUNCTION |
プリミティブ・データ型のバッグ(順序付けられていない値の集合体。値が重複する場合もあります)を処理し、たとえばバッグ内のデータ型や、バッグ内の値の数を判定します。 |
|
CUSTOM_FUNCTION |
|
|
DATE_TIME_ARITHMETIC_FUNCTION |
日時データ型を使用した算術演算を実行します。 |
|
EQUALITY_COMPARISON_FUNCTION |
2つの引数(整数または倍精度データ型)を比較して、それらが等しいかどうかについてのブール値を返します。 |
|
GREATER_THAN_COMPARISON_FUNCTION |
2つの引数(整数または倍精度データ型)を比較して、一方が他方よりも大きいかどうかについてのブール値を返します。 |
|
GREATER_THAN_EQUAL_COMPARISON_FUNCTION |
2つの引数(整数または倍精度データ型)を比較して、一方が他方よりも大きいまたは等しいかどうかについてのブール値を返します。 |
|
HAS_VALUE_EXISTENCE_FUNCTION |
この関数は属性名を引数として取ります。属性に値が割り当てられている場合はtrueを返します。 |
|
HIGHER_ORDER_BAG_FUNCTION |
通常時に関数をバッグに適用できるようにバッグを処理します。 |
|
LESS_THAN_COMPARISON_FUNCTION |
2つの引数(整数または倍精度データ型)を比較して、一方が他方よりも小さいかどうかについてのブール値を返します。 |
|
LESS_THAN_EQUAL_COMPARISON_FUNCTION |
2つの引数(整数または倍精度データ型)を比較して、一方が他方よりも小さいまたは等しいかどうかについてのブール値を返します。 |
|
LOGICAL_FUNCTION |
ブール・データ型引数を処理します。 |
|
NUMERIC_CONVERSION_FUNCTION |
IntegerまたはDoubleデータ型の1つの引数を取得し、対応するIntegerまたはDoubleデータ型を返します。 |
|
REGEXP_FUNCTION |
2つの引数を比較し、1つ目のOpssStringは正規表現を表します。2つ目の引数(任意のタイプ)がその正規表現に一致するかどうかをチェックします。 |
|
SET_FUNCTION |
(重複する要素の削除により)2つのバッグの模倣セットを処理します。 |
|
SPECIAL_MATCH_FUNCTION |
様々なデータ型を処理し、指定された標準の一致アルゴリズムに基づいてブールで評価します。 |
|
STRING_CONVERSION_FUNCTION |
文字列データ型を取得し、定義に従って変換します。 |
|
STRING_FUNCTION |
文字列を取得し、他のデータ型に変換します。 |
|
TYPE_IS_IN_EXISTENCE_FUNCTION |
2つの引数を取ります。1つ目は単一タイプ・オブジェクト、2つ目は同じタイプのバッグです。この関数は、1つ目の引数の値が2つ目の引数で表されたバッグに存在する場合にtrueを返します。 |
|
VALID_FOR_FUNCTION |
この関数は、最初の引数で指定された時間のあいだ、決定キャッシュを有効に保持します。 |
これらの関数は、次の用途に使用できます。
ポリシー・ルールの制約
義務内での値の戻し
カスタム/組込み関数の入力パラメータ
データ型とそれらの使用方法の詳細は、XACML 2.0仕様を参照してください(http://docs.oasis-open.org/xacml/)。
1.2項「単純なポリシーの構成」で説明した単純なポリシーの手順を実行するには、特定の順序でオブジェクトを作成する必要があります。たとえば、ResourceEntryオブジェクトは、ResourceTypeオブジェクトを定義した後にのみ作成できます。次のセクションは、単純なポリシーをプログラムで実行する場合の適切な順序で並べられています。
|
注意: ポリシー・オブジェクトを作成する前に、ポリシー・モデル・コンポーネントの全体的な編成構造を決定する必要があります。たとえば、1つのApplicationPolicyオブジェクトのみを実装し、その親の内部の複数のPolicyDomainEntryオブジェクトにポリシーを委任すると便利な場合があります。詳細は、5.7項「ポリシー・ドメインの委任」を参照してください。 |
あらゆるポリシー管理アクティビティより前に、PolicyStoreオブジェクトのインスタンスを取得する必要があります。次の手順は、oracle.security.jpsパッケージのインタフェースを使用して、PolicyStoreオブジェクトを取得する方法を示しています。Smithは、ポリシーを管理する管理権限を持ったユーザーとして指定されています。
|
注意: コールが認可されていないユーザーのメソッドには、エラーが返されます。 |
PolicyStoreのインスタンスを取得します。次の例では、コードがJVM引数-Doracle.security.jps.config="absolutepath of jps-config.xml"で起動されることを想定しています。
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管理者ガイド』を参照してください。
|
注意:
|
管理ユーザーを指定します。
Subject smith = new Subject();
Principal principal = new WLSUserImpl("smith");
smith.getPrincipals().add(principal);
BindingPolicyStore ps = BindingPolicyStoreFactory.getInstance();ps.setSubject(smith);
このコードは、アプリケーション・コンテナの認証メカニズムを使用してサブジェクトが設定されていない場合にのみ必要になります。認証メカニズムによってサブジェクトを設定している場合は、取得された認証済のサブジェクトはポリシー・ストアへのアクセスを認証されます。BindingPolicyStoreを使用する必要はありません。
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オブジェクトを削除すると、その中に作成されたすべての子オブジェクトも削除されます。 |
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をインスタンス化できます。
階層型のResourceTypeEntryから作成されたResourceEntryに適用可能なポリシーは、子のResourceEntryオブジェクトにも適用可能です。
階層型のResourceTypeEntryから作成されたResourceEntryに定義された属性は、子のResourceEntryオブジェクトにも継承されます。
isHierarchicalResource()メソッドは、ResourceTypeEntryが階層として設定されているかどうかを判定するために使用できます。
ResourceTypeEntryオブジェクトのResourceEntryインスタンスの作成は、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オブジェクトをインスタンス化する場合には、次の条件を満足する必要があります。
|
ResourceActionsEntryオブジェクトは、リソース・インスタンスを、そのインスタンスに対して実行できる一連のアクションと関連付けます。リソース・インスタンスは、静的なResourceEntryまたは動的なResourceNameExpressionのいずれかに指定します。
|
注意: ResourceActionsEntryは、独立して管理可能な名前付きオブジェクトではありません。単純な関係です。 |
詳細は、次の各項を参照してください。
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から抽出されます。
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 |
Policy1とRAE1 |
|
ResType2 (HTTPS URL) |
RAE2とResType2 |
Policy2とRAE2 |
|
RAE3とResType1 |
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の例
| 式 | 説明 |
|---|---|
|
リソース・タイプ固有 |
アクション・タイプを指定するには、リソース・タイプ専用のキーワードを使用します。
|
|
".*" |
すべてのリソースを指定します。
|
|
"http.*" |
先頭がhttpのすべてのリソースを指定します。
|
|
".*html" |
末尾がhtmlのすべてのリソースを指定します。
|
1つ以上のResourceActionsEntryオブジェクトに権限セットを移入することもできます。詳細は、2.4.4「権限セットの定義」を参照してください。
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項「条件の定義」を参照してください。
PrincipalEntryは、ポリシーに関連するユーザー、グループまたはロールを指定します。これは、2.3.8項「ポリシーの定義」の説明のとおり、PolicyEntryオブジェクトに追加します。表2-6は、プリンシパルの種類と、プログラムによってそれらを指定する方法を示しています。
表2-6 プログラムによるプリンシパルの指定
| プリンシパルのタイプ | 例 |
|---|---|
|
ユーザー |
ユーザー・プリンシパル検証プロバイダのクラス名(
PrincipalEntry aUser = new BasicPrincipalEntry
("weblogic.security.principal.WLSUserImpl", "smith");
List<PrincipalEntry> myPrincipal = new
ArrayList<PrincipalEntry>(); myPrincipal.add(aUser);
|
|
グループ |
グループ・プリンシパル検証プロバイダ(
PrincipalEntry aGroup = new BasicPrincipalEntry
("weblogic.security.principal.WLSGroupImpl", "Acme");
List<PrincipalEntry> myPrincipal = new
ArrayList<PrincipalEntry>(); myPrincipal.add(aGroup);
|
|
ロール |
tRoleアプリケーション・ロールを取得し、 AppRoleEntry aRole = appRoleManager.getAppRole(tRole); List<PrincipalEntry> principal = new ArrayList<PrincipalEntry>(); principals.add(tRole); 詳細は、2.4.1項「アプリケーション・ロールの作成」を参照してください。 |
|
匿名ロール |
ポリシーに PrincipalEntry anonymous = new AnonymousRoleEntry(); List<PrincipalEntry> principals = new ArrayList<PrincipalEntry>(); principals.add(anonymous); 詳細は、2.4.1項「アプリケーション・ロールの作成」を参照してください。 |
|
認証ロール |
ポリシーに 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つのみでメンバーになることができます。
ポリシーは、特定のプリンシパルが特定のリソースに対して所有するアクセス権を指定します。基本的に、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.3項「単純なポリシーの実行」では、ポリシーを定義するために最小限必要なコンポーネントの作成方法について説明しました。次の項では、単純なポリシーに1.3項「単純なポリシーへの詳細なオブジェクトの追加」で説明した拡張ポリシー要素の追加方法について説明します。
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);
ロール・マッピング・ポリシーは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または管理ロールとなります。また、このリストを空にすることはできません。
ポリシー・ルール - ruleは、ロール・マッピング・ポリシーの条件を定義するPolicyRuleEntryオブジェクトです。特定の値が必要です。
|
注意: ロール・マッピング・ポリシーの条件は、認可ポリシーの条件と同じ機能を提供します。 |
リソース名 - resourcesは、ロール・マッピング・ポリシーに関連付けるResourceEntryオブジェクトのリストです。これは、NULLまたは空のリストを指定できるオプションのパラメータです。このパラメータでは、ロール・マッピング・ポリシーの範囲を特定の(複数の)リソースに指定することもできます。
リソース名の式 - この値には、リソース名の式を指定して、ロール・マッピング・ポリシーに関連付けることができます。これは、(この例のように)NULLまたは空のリストを指定できるオプションのパラメータです。このパラメータでは、ロール・マッピング・ポリシーの範囲を特定の(複数の)リソースに指定することもできます。
属性または関数定義は、特定の属性または関数を記述するメタデータです。いくつかの情報の中で、属性や関数の名前、属性が取得するデータの型または関数の戻り値を値として定義し、さらに該当する値が単一か複数であるかを定義します。メタデータは、Oracle Entitlements Serverに、定義された特定の属性または関数の処理方法を指定します。属性および関数の定義は条件や義務で使用することができます。条件については、属性および関数の定義を使用して、保護リソースへのアクセスをさらに制限するためにポリシーに追加できるオプションの式を作成できます。義務については、このオプションの名前と値のペアから、ポリシー決定によって、ポリシー実行ポイント(PEP)に追加情報が返されます。義務を定義するには次の2つの方法があります。
絶対値を含む属性が返される場合に、静的に定義。
属性値またはカスタム関数が実行時に評価され出力が返される場合に、動的に定義。
属性および関数定義は、ApplicationPolicyレベルで管理されます。定義は、Oracle Entitlements Server用に事前定義されたものを使用するか、ExtensionManagerを使用して要求に合せて新しいものを定義できます。カスタム定義の作成に関する情報は、次の項を参照してください。
事前定義されたRuleExpressionEntry.BuiltInAttributesおよびRuleExpressionEntry.BuiltInFunctions列挙定義の情報は、Oracle Fusion Middleware Oracle Entitlements Server管理Java APIリファレンスを参照してください。
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の値は複数の値を示します。
カスタム関数は、外部から実装されたロジックを表し、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項「カスタム関数の開発」を参照してください。
1.2項「単純なポリシーの構成」に記載されているとおり、PermissionSetEntryオブジェクトは、1つ以上のResourceActionsEntryオブジェクトを集約するために使用します。ResourceActionsEntryオブジェクトは、保護するリソースと、ポリシーによって許可または拒否するアクションをペアにしたものです。(ResourceActionsEntryオブジェクトの詳細は、2.3.5項「リソースへのアクションのポリシー・ルールの関連付け」を参照してください。)PermissionSetEntryを使用すれば、必要時にResourceActionsEntryオブジェクトをバンドルできます。リソースがResourceActionsEntryオブジェクトで参照されている場合、そのリソースはpermissionSetが定義(または変更)されたのと同じポリシー・ドメイン内で定義されている必要があります(後者はpermissionSetがリソースの追加時に変更された場合に適用可能です)。これは、標準の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です。
ポリシー・ルールのオプションの条件は、アクセスのリクエストに応答して返される決定に追加の要求を設定するために使用します。たとえば、条件の使用により、リクエストが特定の場所で発行された場合、または特定の時間に発行された場合にのみリソースへのアクセス権を付与することができます。条件は式の形で作成され、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クラスを使用して、式と(オプションの)パラメータを指定する方法を示しています。
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メンバーのユーザーのみに適用可能であると仮定されています。
AttributeEntryオブジェクトを定義するロジックの個々のコンポーネントを分離します。この例では、普通預金と当座預金の残高の合計($10,000との比較)を定義する属性と、顧客の種類を定義する属性(GOLDとの比較)です。
FunctionEntryオブジェクトを定義するコンポーネントごとに暗黙的に存在する関数を特定します。この例では、合計残高を作成する関数(saving_balance + checking_balance > 10000)と顧客のタイプをチェックする関数(customFunc_checkCustomerType(username, "GOLD"))になります。
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"))
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番目の引数のようになります。 |
BooleanExpressionEntryを作成します。
Oracle Entitlements Serverでは、条件で使用するための多数の事前定義済関数がサポートされています(AND/OR、ブール関数、文字列関数など)。次の項では、使用可能な式の種類に関する情報について説明します。
ブール式は、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の結果を生成します)です。 |
カスタム関数式はカスタム関数を呼び出し、結果に基づいて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);
|
注意: カスタム関数式は、比較演算を使用しません。 |
義務は、ポリシー実行の間.に考慮されるオプションの情報を指定します。この情報は、認可の決定をコールしたエンティティに、解決された結果(GRANTまたはDENY)とともに返され、ポリシーの結果に追加の要件が適用されます。たとえば、特定の金額が当座預金口座から引き出された場合に、口座の名義人の登録携帯電話にテキスト・メッセージが送信されます。
義務は、一連の名前と値のペアを含んだ名前付きオブジェクトとして管理されます。このオブジェクトは、常にポリシーのコンテキストで管理されます。義務を定義するには次の2つの方法があります。
絶対値を持つ属性が義務として返される静的な定義
属性値またはカスタム関数が実行時に評価され、出力が義務として返される動的な定義
ポリシーに義務が含まれている場合、情報は一連の属性を含む名前付きのObligationEntryオブジェクトとしてアプリケーションに返されます。義務を指定するには、戻す値を含んだObligationEntryオブジェクトを作成します。次の手順では、Trader managers may run reports.という文字列メッセージを提供するObligationEntryを作成します。
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.は文字列です。
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は前に作成した属性配列リストです。
ポリシーの作成時に義務を指定します。
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()認可リクエストで、リクエストする必要があります。 |
http://www.oracle.com/technetwork/middleware/oes/overview/index.htmlには、Oracle Entitlements Serverの開発および管理例のリストがあります。