Oracle® Fusion Middleware Identity Governance Framework開発者ガイド

11g リリース2(11.1.2)

B71699-01(原本部品番号:E27133-01)

目次

例一覧

図一覧

表一覧

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

はじめに

- 対象読者

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

- 関連ドキュメント

- 表記規則

新機能

- リリース11gリリース2(11.1.2)の新機能

- リリース11gリリース1(11.1.1)の新機能

1 Identity Governance Frameworkの概要

- 1.1 Identity Governance Frameworkについて

- 1.1.1 組織にとっての利点

- 1.1.2 開発者にとっての利点

- 1.2 Identity Governance Framework APIについて

- 1.3 システム要件と動作保証情報

2 アイデンティティ・ディレクトリAPIの使用

- 2.1 アイデンティティ・ディレクトリAPIについて

- 2.1.1 Identity Directory Serviceについて

- 2.1.2 Identity Directory Serviceのアーキテクチャ

- 2.2 アイデンティティ・ディレクトリAPIの構成

- 2.2.1 論理的なエンティティ構成

- 2.2.2 物理的なアイデンティティ・ストアの構成

- 2.2.3 オペレーション構成

- 2.3 設計に関する推奨事項

- 2.3.1 defaultFetch属性を少なくする

- 2.3.2 アイデンティティ・ディレクトリの初期化は1回にする

- 2.4 例

- 2.4.1 アイデンティティ・ディレクトリ・ハンドルの初期化と取得

- 2.4.2 JPSコンテキストからのアイデンティティ・ディレクトリ・ハンドルの初期化と取得

- 2.4.3 メモリー内アイデンティティ・ディレクトリ・ハンドルの初期化と取得

- 2.4.4 ユーザーの追加

- 2.4.5 指定されたプリンシパルのユーザーの取得

- 2.4.6 ユーザーの変更

- 2.4.7 指定されたID値のユーザーの取得

- 2.4.8 複雑な検索フィルタを使用したユーザーの検索

- 2.4.9 ユーザー・パスワードの変更

- 2.4.10 ユーザー・パスワードのリセット

- 2.4.11 ユーザーの認証

- 2.4.12 ユーザーの削除

- 2.4.13 グループの作成

- 2.4.14 グループの検索

- 2.4.15 管理チェーンの取得

- 2.4.16 ユーザーのReporteeの取得

- 2.4.17 グループへのメンバーの追加

- 2.4.18 グループからのメンバーの削除

- 2.4.19 ユーザーがメンバーとなっているすべてのグループの取得

3 ArisID APIの使用

- 3.1 ArisID APIについて

- 3.2 ArisID APIの構成

- 3.2.1 CARMLファイルの構成

- 3.2.2 アイデンティティ・リポジトリの構成

- 3.2.3 マッピング・ファイルの構成

- 3.3 設計に関する推奨事項

- 3.3.1 LoginIDの選択

- 3.3.2 UniqueKeyの選択

- 3.3.3 複数言語サポートの指定

- 3.3.4 大規模な結果の処理

- 3.3.5 アプリケーションの保護

- 3.3.5.1 ドメイン・レベルの資格証明

- 3.3.5.2 アプリケーション・レベルの資格証明

- 3.3.6 タイムアウト間隔の構成

- 3.4 ArisID APIを使用したアプリケーションの開発

- 3.4.1 JDeveloperでの開発

- 3.4.1.1 プロジェクトの作成

- 3.4.1.2 CARMLファイルの作成と編集

- 3.4.1.3 ArisID Beanの生成

- 3.4.1.4 アプリケーションでのArisID Beanの使用方法

- 3.4.1.5 マッピング・ファイルの編集

- 3.5 IDXユーザーとロールBeanを使用したサンプル・アプリケーション

- 3.5.1 SearchUsers.jsp

- 3.5.2 SearchUsers.html

4 アイデンティティ・ディレクトリAPIへの移行

- 4.1 概要

- 4.2 アプリケーションの移行

- 4.2.1 APIの初期化

- 4.2.2 UserManagerおよびGroupManagerのハンドルの取得

- 4.2.3 検索フィルタ

- 4.2.4 CRUD操作

- 4.2.4.1 ユーザーの検索

- 4.2.4.2 ユーザーの検索

- 4.2.4.3 ユーザーの作成

- 4.2.4.4 ユーザーの削除

- 4.2.4.5 ユーザーの認証

- 4.2.4.6 ユーザーの変更と関連エンティティの管理

- 4.3 ユーザーおよびロールAPIとIDS APIとの比較

- 4.3.1 ユーザー関連API

- 4.3.2 ロール関連API

例一覧

- 3-1 コード・サンプル: adapters.os_xml

- 3-2 コード・サンプル: adapters.os_xml

図一覧

- 2-1 アイデンティティ・ディレクトリAPIのアーキテクチャ

- 2-2 アイデンティティ・ディレクトリAPIのコンポーネント

- 3-1 IGF ArisID APIアーキテクチャ

表一覧

- 2-1 論理的なエンティティ構成のプロパティ

- 2-2 論理的なエンティティ属性

- 2-3 論理的なエンティティ定義のプロパティ

- 2-4 論理的なエンティティ・リレーションシップのプロパティ

- 2-5 物理的なアイデンティティ・ストア構成のプロパティ

- 2-6 オペレーション構成のエンティティ

- 4-1 ユーザー関連APIとアイデンティティ・ディレクトリAPIとの比較

- 4-2 ロール関連APIとアイデンティティ・ディレクトリAPIとの比較

Oracle® Fusion Middleware

Identity Governance Framework開発者ガイド

11g リリース2(11.1.2)

B71699-01(原本部品番号:E27133-01)

2012年7月

このガイドは、ユーザー、アプリケーションおよびサービス・プロバイダ間でのアイデンティティ関連情報の安全な受渡しを実現するIdentity Governance Framework (IGF)イニシアチブについて説明しています。ここでは、Oracleが提供する、Identity Governance Frameworkベースの開発者向けAPIを使用した開発方法について説明します。

Oracle Fusion Middleware Identity Governance Framework開発者ガイド, 11gリリース2(11.1.2)

B71699-01

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

原本著者:  Trish Fuzesy

原本協力者: Amit Sharma, Venkat Medam, Mark Wilcox

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

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

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

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

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

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

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

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

はじめに

このガイドでは、Identity Governance Frameworkの概要、およびOracleが提供している関連の開発者向けAPIの使用方法について説明します。ここでは、アイデンティティ管理アプリケーションがアイデンティティ情報にアクセスして管理するための共通サービスであるアイデンティティ・ディレクトリAPIについて説明します。また、Identity Governance Framework ArisID APIを実装するOracle Fusion Middlewareアプリケーションを作成するためのArisID Oracle JDeveloper拡張についても説明します。

対象読者

このドキュメントは、Oracle Fusion Middleware Identity Governance FrameworkベースのAPIを使用するアプリケーションを記述する開発者を対象としています。

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

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

Oracleサポートへのアクセス

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

関連ドキュメント

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

- Oracle Fusion Middleware Identity Governance Frameworkアイデンティティ・ディレクトリJava APIリファレンス

- Oracle Fusion Middleware Identity Governance Framework IDXUserRole Java APIリファレンス

- 『Oracle Fusion Middlewareアプリケーション・セキュリティ・ガイド』

- Identity Governance Framework ArisID JDeveloper拡張のオンライン・ヘルプ

- Project Aristotle - ArisID Attribute ServicesのJavadoc (http://arisid.sourceforge.net/javadocs/arisId_1.1_javadoc/)

表記規則

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

規則

意味

太字

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

イタリック体

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

固定幅フォント

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

新機能

Identity Governance FrameworkベースのOracle APIの新機能(現在のリリースと前回のリリース)を次に示します。

リリース11gリリース2(11.1.2)の新機能

11gリリース2(11.1.2)では、アイデンティティ・ディレクトリAPIが提供されます。これは、アイデンティティ管理アプリケーションのための共通サービスであり、アイデンティティ情報にアクセスして管理します。このサービスはJava EEおよびJava SEの両方のモードで使用できます。詳細は、第2章「アイデンティティ・ディレクトリAPIの使用」を参照してください。

リリース11g リリース1(11.1.1)の新機能

11gリリース1(11.1.1)では、ArisID APIが提供されます。これは、エンタープライズ開発者とシステム設計者に、複数のアイデンティティ・プロトコルを使用したアイデンティティ対応のアプリケーションを作成するためのライブラリを提供します。ArisID APIでは、開発者は、Client Attribute Requirements Markup Language (CARML)を使用して、アイデンティティの属性、ロールおよび検索フィルタの要件を指定できます。詳細は、第3章「ArisID APIの使用」を参照してください。

1 Identity Governance Frameworkの概要

Identity Governance Framework (IGF)イニシアチブは、ユーザー、アプリケーションおよびサービス・プロバイダ間でのアイデンティティ関連情報の安全な受渡しを実現します。また、アプリケーションおよびサービス・インフラストラクチャにプライバシと管理のセマンティクスを提供します。この章では、Identity Governance Frameworkの概要、およびOracleが提供している関連の開発者向けAPIについて説明します。この章の内容は次のとおりです。

- 第1.1項「Identity Governance Frameworkについて」

- 第1.2項「Identity Governance Framework APIについて」

- 第1.3項「システム要件と動作保証情報」

1.1 Identity Governance Frameworkについて

Identity Governance Frameworkは、次の目標を実現するために設計されたオープン・イニシアチブです。

- 格納場所に関係なく、アイデンティティ情報へのアクセス方法の開発を簡易化すること。

- アプリケーションでのアイデンティティ・データ(特に、機密データ)の使用方法の管理(ガバナンスとも呼ばれる)を簡易化すること。

このイニシアチブの一員として、オラクル社は主な初期の仕様を提供し、コミュニティで使用できるようにしています。これらの仕様では、使用法のポリシー、属性要件およびアイデンティティ関連の情報の使用に関係する開発者APIを定義するための共通のフレームワークが提供されます。これらによって、ビジネスは、システムおよびアプリケーション全体でのアイデンティティ関連のデータの使用、格納および伝播に関係なく、ドキュメント化、制御および監査を完全に行うことができます。

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

- 組織にとっての利点

- 開発者にとっての利点

1.1.1 組織にとっての利点

組織は、顧客、従業員および取引先に関する個人の機密情報の制御と保全を保つ必要があります。社会保障番号、クレジット・カード番号、病歴などに関連するデータは、この種の情報の悪用や盗用を防ぐよう求める規制によって一層の注意が求められています。プライバシに配慮する組織が、業務の妨げとなったり、生産性、柔軟性および効率に影響するような過度に厳格な制御とプロセスを施行してこれらの要求に応えようとすることが多々あります。反対に、この情報を保護するために必要な措置をとらず、十分な監視と制御を行わずにアイデンティティ関連のデータを潜在的に危険な状態にする組織もあります。Identity Governance Frameworkによって、エンタープライズ用の標準ベースのメカニズムで、アプリケーション間で"契約"を結び、データが悪用されたり、危険にさらされたり、置き違えられたりしないという信頼性のもと、アイデンティティ関連の情報を安全に共有できます。このフレームワークを使用すると、組織は、ビジネス全体でのアイデンティティ情報の格納、使用および伝播のされ方を完全に可視化できます。これによって、組織は、アイデンティティ関連の情報の機密性を損なうことなく、ビジネス・プロセスを効率化するための制御を自動化できます。

1.1.2 開発者にとっての利点

Identity Governance Frameworkは、アプリケーションを記述する際のアイデンティティ関連のデータの処理方法の指定について取り決められたプロセスです。これによって、このデータを使用するアプリケーションを簡単に記述し、管理ポリシーを使用して制御できるようにする標準ベースの方法が開発者に提供されます。このことにより、プライバシを考慮したアプリケーションを短期間で開発できるようになります。

IGFによって、アイデンティティに対応するアプリケーションをデプロイ・インフラストラクチャから切り離すことができます。具体的には、IGFを使用すると、開発者は、アイデンティティ関連の情報の格納方法およびアプリケーションによるアクセス方法の決定を遅らせることができます。開発者は、SQLデータベースを使用するか、LDAPディレクトリを使用するか、あるいは他のシステムを使用するかについて悩む必要がなくなります。過去には、開発者は特異性の高いコードの記述を余儀なくされ、テクノロジとベンダーの固定化につながっていました。

たとえば、Identity Directory APIは、ドメイン・アイデンティティ・ストアであるディレクトリ・サーバー内でアイデンティティ情報にアクセスし、管理する方法を提供します。エンティティ定義、エンティティ・リレーションシップ、およびその物理的なアイデンティティ・ストアの詳細は、アイデンティティ・ディレクトリの構成APIまたはMbeanを使用して構成できます。Identity Directory Serviceの初期化にはアイデンティティ・ディレクトリAPIを使用します。Identity Directory Serviceは、異なるアイデンティティ・ストアに格納されているユーザーおよびグループ情報にアクセスし、それらを変更するためのインタフェースを提供します。詳細は、第2章「アイデンティティ・ディレクトリAPIの使用」を参照してください。

別の例として、ArisID APIがあります。アイデンティティベースの情報については、データの取得、変換およびポリシーの強制といった難しい処理がArisID APIによって行われます。Client Attribute Requirement Markup Language (CARML)ファイルと宣言を使用することで、継続的に専門的な開発者の増強を必要とせずに、様々な環境での柔軟なデプロイがアプリケーションによってサポートされます。詳細は、第3章「ArisID APIの使用」を参照してください。

1.2 Identity Governance Framework APIについて

Oracleでは、Identity Governance Frameworkベースの次のAPIを提供しています。

- アイデンティティ・ディレクトリAPI
アイデンティティ・ディレクトリAPIは、アイデンティティ情報にアクセスして管理するアイデンティティ管理アプリケーションのための共通サービスです。このサービスはJava EEおよびJava SEの両方のモードで使用できます。詳細は、第2章「アイデンティティ・ディレクトリAPIの使用」を参照してください。

- ArisID API
ArisID APIは、エンタープライズ開発者とシステム設計者に、複数のアイデンティティ・プロトコルを使用したアイデンティティ対応のアプリケーションを作成するためのライブラリを提供します。ArisID APIでは、開発者は、Client Attribute Requirements Markup Language (CARML)を使用して、アイデンティティの属性、ロールおよび検索フィルタの要件を指定できます。詳細は、第3章「ArisID APIの使用」を参照してください。

1.3 システム要件と動作保証情報

ハードウェアとソフトウェアの要件、プラットフォーム、データベースおよびその他の情報の詳細は、システム要件と動作要件のドキュメントを参照してください。いずれのドキュメントもOracle Technology Network (OTN)から入手できます。

システム要件のドキュメントには、ハードウェアとソフトウェアの要件、ディスク領域とメモリーの最小要件、必要なシステム・ライブラリ、パッケージまたはパッチなどの情報が記載されています。

http://www.oracle.com/technetwork/middleware/ias/downloads/fusion-requirements-100147.html

動作要件のドキュメントには、サポートされているインストール・タイプ、プラットフォーム、オペレーティング・システム、データベース、JDKおよびサードパーティ製品が記載されています。

http://www.oracle.com/technetwork/middleware/ias/downloads/fusion-certification-100350.html

2 アイデンティティ・ディレクトリAPIの使用

この章では、Identity Governance Framework Identity Directory API (アイデンティティ・ディレクトリAPI)およびIdentity Directory Serviceのアーキテクチャと主要な機能について説明します。アイデンティティ・ディレクトリAPIは、ユーザー、グループおよび組織へのアクセスと管理をサポートします。また、新しいエンティティ・タイプおよびそれらのエンティティ間で定義されたリレーションシップをサポートするように拡張することもできます。この章の内容は次のとおりです。

- 第2.1項「アイデンティティ・ディレクトリAPIについて」

- 第2.2項「アイデンティティ・ディレクトリAPIの構成」

- 第2.3項「設計に関する推奨事項」

- 第2.4項「例」

2.1 アイデンティティ・ディレクトリAPIについて

アイデンティティ・ディレクトリAPIは、アイデンティティ管理アプリケーションがアイデンティティ情報にアクセスし、管理するためのサービスを提供します。柔軟性のあるこのAPIは、クライアントによって完全に構成可能であり、標準および固有のスキーマを持つ様々なアイデンティティ・ストアをサポートします。さらに堅牢であり、高可用性およびフェイルオーバー・サポートの両方を提供します。

このAPIは、Identity Governance Frameworkを使用し、Identity Governanceのすべての利点を提供します。このAPIはJava EEおよびJava SEの両方のモードで使用できます。Identity Governance Frameworkの詳細は、第1章「Identity Governance Frameworkの概要」を参照してください。

APIでサポートされるアクションは次のとおりです。

- ユーザー、グループ、組織のエンティティおよび汎用エンティティに対する作成/読取り/更新/削除(CRUD)操作の実行

- ユーザー・アカウント状態の取得操作

- アイデンティティ・ディレクトリAPIの構成の共有

- Oracle Internet Directory、Oracle Universal Directory、Oracle Directory Server EEおよびADなどのディレクトリ・サーバーのサポート

Identity Directory Serviceには次のものが含まれます。

- アイデンティティ・ディレクトリAPI
ドメイン・アイデンティティ・ストアであるディレクトリ・サーバー内でアイデンティティ情報にアクセスし、管理する方法を提供します。エンティティ定義、エンティティ・リレーションシップ、およびその物理的なアイデンティティ・ストアの詳細は、アイデンティティ・ディレクトリの構成APIまたはMbeanを使用して構成できます。ディレクトリ・サービス・インスタンスの機能は、ゲッター・メソッドを使用して問い合せることができます。

- アイデンティティ・ディレクトリAPIの構成
アイデンティティ・ディレクトリAPIの構成には、論理的なエンティティ構成と物理的なアイデンティティ・ストア構成が含まれます。

2.1.1 Identity Directory Serviceについて

Identity Directory Serviceは、アイデンティティ管理製品がアイデンティティ・ディレクトリにアクセスし、管理するために使用する共通サービスです。Identity Directory Serviceの初期化にはアイデンティティ・ディレクトリAPIを使用します。Identity Directory Serviceは、異なるアイデンティティ・ストアに格納されているユーザーおよびグループ情報にアクセスし、それらを変更するためのインタフェースを提供します。アイデンティティ・ディレクトリはIdentity Directory Serviceのインスタンスであり、次のものが含まれています。

- 一意の名前 (IDS名)

- 論理的なエンティティ構成

- 物理的なアイデンティティ・ストア構成

2.1.2 Identity Directory Serviceのアーキテクチャ

図2-2は、アイデンティティ・ディレクトリAPIの論理的なアーキテクチャを示します。

図2-1 アイデンティティ・ディレクトリAPIのアーキテクチャ

「図2-1 アイデンティティ・ディレクトリAPIのアーキテクチャ」の説明

図2-2は、アイデンティティ・ディレクトリAPIのコンポーネント間のリレーションシップを示します。

図2-2 アイデンティティ・ディレクトリAPIのコンポーネント

「図2-2 アイデンティティ・ディレクトリAPIのコンポーネント」の説明

2.2 アイデンティティ・ディレクトリAPIの構成

アイデンティティ・ディレクトリAPIは、異なるアイデンティティ・ストアに格納されているユーザーおよびグループ情報にアクセスし、それらを変更するためのインタフェースを提供します。

Identity Directory Serviceの構成は、論理的なエンティティ構成、物理的なアイデンティティ・ストア構成およびオペレーション構成の組合せになります。

論理的なエンティティ構成およびオペレーション構成は、ids-config.xmlに格納されています。このファイルは、jps-config.xmlと同じディレクトリにあります。たとえば、Java EE環境では次の場所にあります。

DOMAIN_HOME/config/fmwconfig/ids-config.xml

物理的なアイデンティティ・ストア構成は、ovd/ids/adapters.os.xmlにあります。たとえば、ovdディレクトリは、Java EE環境では次の場所にあります。

DOMAIN_HOME/config/fmwconfig

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

- 論理的なエンティティ構成

- 物理的なアイデンティティ・ストア構成

- オペレーション構成

2.2.1 論理的なエンティティ構成

表2-1は、論理的なエンティティ構成のプロパティについて説明しています。

表2-1 論理的なエンティティ構成のプロパティ

名前

説明

name

Identity Directory Serviceを一意に識別する名前です。

description

Identity Directory Serviceの詳細な説明です。

ovd.context

有効な値はdefaultまたはidsです。OPSSで構成されている同じアイデンティティ・ストアに接続するには、defaultを使用します。OPSSに依存せず構成された物理的なアイデンティティ・ストアに接続するには、idsを使用します。デフォルトのアイデンティティ・ディレクトリ(userroleおよびidxuserrole)のみdefault値を使用します。

app.name

Identity Directory Serviceの構成対象である特定のアプリケーションを指定するプロパティです(オプション)。

表2-2は、論理的な属性を説明します。

表2-2 論理的なエンティティ属性

名前

説明

name

論理的な属性の名前です。

dataType

有効なデータ・タイプの値は、string、boolean、integer、double、datetime、binary、x500nameおよびrfc822nameです。

description

論理的な属性の詳細な説明です。

readOnly

デフォルトはfalseです。属性が読取り専用の場合はtrueを使用します。

pwdAttr

デフォルトはfalseです。属性がパスワード属性の場合はtrueを使用します。

表2-3は、論理的なエンティティ定義ごとに必要なプロパティを説明します。

表2-3 論理的なエンティティ定義のプロパティ

名前

説明

name

エンティティの名前。

type

有効なエンティティの値は、user、group、orgおよびotherです。

idAttr

エンティティを一意に識別する論理的な属性です。

create

このエンティティの作成が許可されている場合はtrueを使用します。そうでない場合はfalseを使用します。

modify

このエンティティの変更が許可されている場合はtrueを使用します。そうでない場合はfalseを使用します。

delete

このエンティティの削除が許可されている場合はtrueを使用します。そうでない場合はfalseを使用します。

search

このエンティティの検索が許可されている場合はtrueを使用します。そうでない場合はfalseを使用します。

Attribute References

次の詳細を含むエンティティ属性のリファレンスのリストです。

- name: 論理的な属性の名前。

- defaultFetch: デフォルト値はtrueです。属性がデフォルトでフェッチされる場合はtrueを使用します。たとえば、アイデンティティ・ディレクトリAPIを使用してエンティティを読み取る場合、リクエストした属性にこの属性が含まれていなくても、この属性値はアイデンティティ・ストアからフェッチされます。

- filter: 検索フィルタのタイプです。有効な値として、none、dynamic、equals、notequals、beginswith、contains、doesnotcontain、endswith、greaterequal、lessequal、greaterthanおよびlessthanのいずれかの値を持ちます。noneはフィルタのサポートがないことを意味します。

表2-4は、論理的なエンティティ・リレーションシップ定義ごとに必要なプロパティを説明します。

表2-4 論理的なエンティティ・リレーションシップのプロパティ

名前

説明

name

エンティティ・リレーションシップの名前です。

type

有効なエンティティの値は、OneToOne、OneToMany、ManyToOneおよびManyToManyです。

fromEntity

エンティティ・リレーションシップの最初のエンティティの名前です。

fromAttr

最初のエンティティの属性です。この属性値は、リレーションシップの2番目のエンティティに関連します。

toEntity

エンティティ・リレーションシップの2番目のエンティティの名前です。

toAttr

2番目のエンティティの属性です。fromAttrプロパティの値は、2番目のエンティティのこの属性にマップされます。

recursive

エンティティ・リレーションシップが再帰的な場合はtrueを使用します。デフォルトはfalseです。

2.2.2 物理的なアイデンティティ・ストアの構成

表2-5は、物理的なアイデンティティ・ストア構成のプロパティについて説明します。

表2-5 物理的なアイデンティティ・ストア構成のプロパティ

名前

説明

HostおよびPort

アイデンティティ・ストアのホストおよびポートの情報です。フェイルオーバー用に代替ホストおよびポートの詳細を設定することもできます。

Directory Type

ディレクトリのタイプです。有効な値は、OID、ACTIVE_DIRECTORY、IPLANET、EDIRECTORY、OPEN_LDAP、WLS_OVDおよびOUDです。

Bind DNおよびPassword

ディレクトリに接続するための資格証明です。

2.2.3 オペレーション構成

オペレーション構成には、主に、各エンティティのbase、name attributeおよびobjectclassの構成が含まれます。

表2-6は、オペレーション構成のエンティティを説明します。

表2-6 オペレーション構成のエンティティ

名前

説明

entity.searchbase

エンティティを検索する必要のあるコンテナです。

entity.createbase

新しいエンティティが作成されるコンテナです。

entity.name.attr

エンティティのRDN属性です。

entity.filter.objclasses

このエンティティの検索時に使用されるobjectclassフィルタです。

entity.create.objclasses

この新しいエンティティの作成時に追加されるobjectclassesです。

2.3 設計に関する推奨事項

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

- defaultFetch属性を少なくする

- アイデンティティ・ディレクトリの初期化は1回にする

2.3.1 defaultFetch属性を少なくする

新しいアイデンティティ・ディレクトリを構成する際、エンティティのdefaultFetch属性の数はできるかぎり少なくしてください。また、jpegphotoのように値が大きい属性は、defaultFetchの値をfalseで構成します。これは、エンティティをバックエンドから読み取るたびに、すべてのdefaultFetch属性がバックエンド・ディレクトリから取得されるためです。defaultFetch属性が多すぎるとパフォーマンスに影響を与えます。

2.3.2 アイデンティティ・ディレクトリの初期化は1回にする

アイデンティティ・ディレクトリの初期化では、ArisIdスタック全体の初期化にかなりの負荷がかかります。そのため、アプリケーションでのアイデンティティ・ディレクトリの初期化は1回のみ、できれば起動時に実行し、全体を通して同じハンドルを使用することをお薦めします。

2.4 例

この項では、次のコード・サンプルを示します。

- アイデンティティ・ディレクトリ・ハンドルの初期化と取得

- JPSコンテキストからのアイデンティティ・ディレクトリ・ハンドルの初期化と取得

- メモリー内アイデンティティ・ディレクトリ・ハンドルの初期化と取得

- ユーザーの追加

- 指定されたプリンシパルのユーザーの取得

- ユーザーの変更

- 指定されたID値のユーザーの取得

- 複雑な検索フィルタを使用したユーザーの検索

- ユーザー・パスワードの変更

- ユーザー・パスワードのリセット

- ユーザーの認証

- ユーザーの削除

- グループの作成

- グループの検索

- 管理チェーンの取得

- ユーザーのReporteeの取得

- グループへのメンバーの追加

- グループからのメンバーの削除

- ユーザーがメンバーとなっているすべてのグループの取得

2.4.1 アイデンティティ・ディレクトリ・ハンドルの初期化と取得

次のコード・サンプルでは、アイデンティティ・ディレクトリへのハンドルを初期化して取得します。

import oracle.igf.ids.UserManager;
import oracle.igf.ids.GroupManager;
import oracle.igf.ids.config.OperationalConfig;
import oracle.igf.ids.IdentityDirectoryFactory;
import oracle.igf.ids.IdentityDirectory;
import oracle.igf.ids.IDSException;

public class IdsSample {

private IdentityDirectory ids;
private UserManager uMgr;
private GroupManager gMgr;

public IdsSample() throws IDSException {
// Set Operational Config
OperationalConfig opConfig = new OperationalConfig();

// Set the application credentials (optional).  This
overrides the credentials set in
// physical ID store configuration
opConfig.setApplicationUser("cn=user1,dc=us,dc=oracle,dc=com");
opConfig.setApplicationPassword("password".toCharArray());

// Set search/crate base, name, objclass, etc. config
(optional).  This overrides default operational configuration
in IDS
opConfig.setEntityProperty("User", opConfig.SEARCH_BASE,
"dc=us,dc=oracle,dc=com");
opConfig.setEntityProperty("User", opConfig.CREATE_BASE,
"dc=us,dc=oracle,dc=com");
opConfig.setEntityProperty("User", opConfig.FILTER
_OBJCLASSES, "person");
opConfig.setEntityProperty("User", opConfig.CREATE
_OBJCLASSES, "inetorgperson");
opConfig.setEntityProperty("Group", opConfig.SEARCH
_BASE, "cn=groups,dc=us,dc=oracle,dc=com");
opConfig.setEntityProperty("Group", opConfig.CREATE
_BASE, "cn=groups,dc=us,dc=oracle,dc=com");
opConfig.setEntityProperty("Group", opConfig.FILTER
_OBJCLASSES, "groupofuniquenames");
opConfig.setEntityProperty("Group", opConfig.CREATE
_OBJCLASSES, "groupofuniquenames");

// Get IdentityDirectory "ids1" configured in IDS config
IdentityDirectoryFactory factory = new
IdentityDirectoryFactory();
ids = factory.getIdentityDirectory("ids1", opConfig);

// Get UserManager and GroupManager handles
uMgr = ids.getUserManager();
gMgr = ids.getGroupManager();
}
}

2.4.2 JPSコンテキストからのアイデンティティ・ディレクトリ・ハンドルの初期化と取得

次のコード・サンプルでは、JPSコンテキストからアイデンティティ・ディレクトリ・ハンドルを初期化して取得します。

import oracle.igf.ids.UserManager;
import oracle.igf.ids.GroupManager;
import oracle.igf.ids.config.OperationalConfig;
import oracle.igf.ids.IdentityDirectoryFactory;
import oracle.igf.ids.IdentityDirectory;
import oracle.igf.ids.IDSException;

import oracle.security.jps.JpsContext;
import oracle.security.jps.JpsContextFactory;
import oracle.security.jps.service.idstore.IdentityStoreService;

public class IdsSample {

private IdentityDirectory ids;
private UserManager uMgr;
private GroupManager gMgr;

public IdsSample() throws IDSException {

// Get IdentityDirectory from JpsContext
try {
JpsContext context =
JpsContextFactory.getContextFactory().getContext();
IdentityStoreService idstore = (IdentityStoreService)
context.getServiceInstance(IdentityStoreService.class);
ids = idstore.getIdentityStore();
} catch (Exception e) {
throw new IDSException(e);
}

// Get UserManager and GroupManager handles
uMgr = ids.getUserManager();
gMgr = ids.getGroupManager();
}
}

2.4.3 メモリー内アイデンティティ・ディレクトリ・ハンドルの初期化と取得

次のコード・サンプルでは、メモリー内アイデンティティ・ディレクトリ・ハンドルを初期化して取得します。

import java.util.ArrayList;
import java.util.List;

import oracle.igf.ids.UserManager;
import oracle.igf.ids.GroupManager;
import oracle.igf.ids.config.AttributeDef;
import oracle.igf.ids.config.AttributeRef;
import oracle.igf.ids.config.EntityDef;
import oracle.igf.ids.config.EntitiesConfig;
import oracle.igf.ids.config.EntityRelationship;
import oracle.igf.ids.config.IdentityStoreConfig;
import oracle.igf.ids.config.OperationalConfig;
import oracle.igf.ids.IdentityDirectoryFactory;
import oracle.igf.ids.IdentityDirectory;
import oracle.igf.ids.IDSException;

public class IdsSample {

private IdentityDirectory ids;
private UserManager uMgr;
private GroupManager gMgr;
public IdsSample() throws IDSException {

// Add Attribute definitions
List<AttributeDef> attrDefs = new ArrayList<AttributeDef>();
attrDefs.add(new AttributeDef("cn", AttributeDef.DataType.STRING));
attrDefs.add(new AttributeDef("firstname", AttributeDef.DataType.STRING));
attrDefs.add(new AttributeDef("sn", AttributeDef.DataType.STRING));
attrDefs.add(new AttributeDef("telephonenumber",
AttributeDef.DataType.STRING));
attrDefs.add(new AttributeDef("uid", AttributeDef.DataType.STRING));
attrDefs.add(new AttributeDef("uniquemember",
AttributeDef.DataType.STRING));

// Add User entity definition
List<EntityDef> entityDefs = new ArrayList<EntityDef>();
EntityDef userEntityDef = new EntityDef("User", EntityDef.EntityType.USER,
"cn");
userEntityDef.addAttribute(new AttributeRef("cn"));
userEntityDef.addAttribute(new AttributeRef("firstname"));
userEntityDef.addAttribute(new AttributeRef("sn"));
userEntityDef.addAttribute(new AttributeRef("telephonenumber"));
userEntityDef.addAttribute(new AttributeRef("uid"));
entityDefs.add(userEntityDef);

// Add Group entity definition
EntityDef groupEntityDef = new EntityDef("Group",
EntityDef.EntityType.GROUP, "cn");
groupEntityDef.addAttribute(new AttributeRef("cn"));
groupEntityDef.addAttribute(new AttributeRef("uniquemember", false,
AttributeRef.FilterType.EQUALS));
entityDefs.add(groupEntityDef);

// Add Entity relationship definition
List<EntityRelationship> entityRelations = new
ArrayList<EntityRelationship>();
entityRelations.add(new EntityRelationship("user_memberOfGroup",
EntityRelationship.RelationshipType.MANYTOMANY, "User",
"principal", "Group", "uniquemember"));
entityRelations.add(new EntityRelationship("group_memberOfGroup",
EntityRelationship.RelationshipType.MANYTOMANY, "Group",
"principal", "Group", "uniquemember", true));
EntitiesConfig entityCfg = new EntitiesConfig(attrDefs,
entityDefs, entityRelations);

// Create physical Identity Store configuration
IdentityStoreConfig idStoreCfg = new IdentityStoreConfig(
"ldap://host1:389,ldap://host2:389", "cn=orcladmin",
"password".toCharArray(), IdentityStoreConfig.IdentityStoreType.OID);

idStoreCfg.setHighAvailabilityOption(IdentityStoreConfig.HAOption.FAILOVER);
idStoreCfg.setProperty(IdentityStoreConfig.HEARTBEAT_INTERVAL, "60");
idStoreCfg.setProperty(IdentityStoreConfig.CONN_TIMEOUT, "30000");    //
milli sec
idStoreCfg.setProperty(IdentityStoreConfig.MIN_POOLSIZE, "5");
idStoreCfg.setProperty(IdentityStoreConfig.MAX_POOLSIZE, "10");
idStoreCfg.setProperty(IdentityStoreConfig.MAX_POOLWAIT, "1000");     //
milli sec
idStoreCfg.setProperty(IdentityStoreConfig.MAX_POOLCHECKS, "10");
idStoreCfg.setProperty(IdentityStoreConfig.FOLLOW_REFERRAL, "false");
idStoreCfg.setAttrMapping("firstname", "givenname");

// Set operational config
OperationalConfig opConfig = new OperationalConfig();
opConfig.setEntityProperty(opConfig.USER_ENTITY, opConfig.SEARCH_BASE,
"cn=users,dc=us,dc=oracle,dc=com");
opConfig.setEntityProperty(opConfig.USER_ENTITY, opConfig.CREATE_BASE,
"cn=users,dc=us,dc=oracle,dc=com");
opConfig.setEntityProperty(opConfig.USER_ENTITY, opConfig.NAME_ATTR,
"cn");
opConfig.setEntityProperty(opConfig.USER_ENTITY, opConfig.FILTER
_OBJCLASSES, "inetorgperson");
opConfig.setEntityProperty(opConfig.USER_ENTITY, opConfig.CREATE
_OBJCLASSES, "inetorgperson");
opConfig.setEntityProperty(opConfig.GROUP_ENTITY, opConfig.SEARCH_BASE,
"cn=groups,dc=us,dc=oracle,dc=com");
opConfig.setEntityProperty(opConfig.GROUP_ENTITY, opConfig.CREATE_BASE,
"cn=groups,dc=us,dc=oracle,dc=com");
opConfig.setEntityProperty(opConfig.GROUP_ENTITY, opConfig.NAME_ATTR,
"cn");
opConfig.setEntityProperty(opConfig.GROUP_ENTITY, opConfig.FILTER
_OBJCLASSES, "groupofuniquenames");
opConfig.setEntityProperty(opConfig.GROUP_ENTITY, opConfig.CREATE
_OBJCLASSES, "groupofuniquenames");

// Initialize Identity Store Service
IdentityDirectoryFactory factory = new IdentityDirectoryFactory();
ids = factory.getIdentityDirectory("ids1", entityCfg, idStoreCfg,
opConfig);

// Get UserManager and GroupManager handles
uMgr = ids.getUserManager();
gMgr = ids.getGroupManager();
}

}

2.4.4 ユーザーの追加

次のコード・サンプルでは、アイデンティティ・ストアにユーザーを追加します。

Principal principal = null;

List<Attribute> attrs = new ArrayList<Attribute>();
attrs.add(new Attribute("commonname", "test1_user1"));
attrs.add(new Attribute("password", "mypassword".toCharArray()));
attrs.add(new Attribute("firstname", "test1"));
attrs.add(new Attribute("lastname", "user1"));
attrs.add(new Attribute("mail", "test1.user1@oracle.com"));
attrs.add(new Attribute("telephone", "1 650 123 0001"));
attrs.add(new Attribute("title", "Senior Director"));
attrs.add(new Attribute("uid", "tuser1"));

try {
CreateOptions createOpts = new CreateOptions();

principal = uMgr.createUser(attrs, createOpts);

System.out.println("Created user " + principal.getName());

} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}

2.4.5 指定されたプリンシパルのユーザーの取得

次のコード・サンプルでは、指定されたプリンシパルのユーザーを取得します。

User user = null;

try {
ReadOptions readOpts = new ReadOptions();

user = uMgr.getUser(principal, readOpts);

} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}

2.4.6 ユーザーの変更

次のコード・サンプルでは、アイデンティティ・ディレクトリのユーザーを変更します。

try {
ModifyOptions modifyOpts = new ModifyOptions();

List<ModAttribute> attrs = new ArrayList<ModAttribute>();
attrs.add(new ModAttribute("description", "modified test user 1"));

user.modify(attrs, modifyOpts);

System.out.println("Modified user " + user.getName());
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}

2.4.7 指定されたID値のユーザーの取得

次のコード・サンプルでは、指定されたアイデンティティ値と一致するユーザーを取得します。

try {
ReadOptions readOpts = new ReadOptions();

User user = uMgr.searchUser("tuser1", readOpts);

} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}

2.4.8 複雑な検索フィルタを使用したユーザーの検索

次のコード・サンプルでは、複雑な検索フィルタを使用したユーザーの検索方法を示します。

try {
// Complex search filter with nested AND and OR conditiions
SearchFilter filter = new SearchFilter(
SearchFilter.LogicalOp.OR,
new SearchFilter(SearchFilter.LogicalOp.AND,
new SearchFilter("firstname", SearchFilter.Operator.BEGINS_WITH,
"test"),
new SearchFilter("telephone", SearchFilter.Operator.CONTAINS,
"650")),
new SearchFilter(SearchFilter.LogicalOp.AND,
new SearchFilter("firstname", SearchFilter.Operator.BEGINS_WITH,
"demo"),
new SearchFilter(SearchFilter.LogicalOp.OR,
new SearchFilter("orgunit", SearchFilter.Operator.BEGINS_WITH,
"hr"),
new SearchFilter("orgunit", SearchFilter.Operator.BEGINS_WITH,
"it"),

new SearchFilter("telephone", SearchFilter.Operator.CONTAINS,
"650")));

// Requesting attributes
List<String> reqAttrs = new ArrayList<String>();
reqAttrs.add("jpegphoto");

SearchOptions searchOpts = new SearchOptions();
searchOpts.setPageSize(100);
searchOpts.setRequestedAttrs(reqAttrs);
searchOpts.setSortAttrs(new String[] {"firstname"});

ResultSet<User> sr = uMgr.searchUsers(filter, searchOpts);
while (sr.hasMore()) {
User user = sr.getNext();
System.out.println(user.getSubjectName());
}

} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}

2.4.9 ユーザー・パスワードの変更

次のコード・サンプルでは、ユーザー・パスワードの変更方法を示します。

ModifyOptions modOpts = new ModifyOptions();

try {
user.changePassword("welcome123".toCharArray(),
"welcome1".toCharArray(), modOpts);
System.out.println("Changed user password");
} catch (Exception e) {
System.out.println("Failed to change user password");
e.printStackTrace();
}

2.4.10 ユーザー・パスワードのリセット

次のコード・サンプルでは、ユーザー・パスワードのリセット方法を示します。

ModifyOptions modOpts = new ModifyOptions();

try {
user.resetPassword("welcome123".toCharArray(), modOpts);
System.out.println("Reset user password");
} catch (Exception e) {
System.out.println("Failed to reset user password");
e.printStackTrace();
}

2.4.11 ユーザーの認証

次のコード・サンプルでは、ユーザーの認証方法を示します。

ReadOptions readOpts = new ReadOptions();
try {
User user = uMgr.authenticateUser("tuser1",
"mypassword".toCharArray(), readOpts);
System.out.println("authentication success");
} catch (Exception e) {
System.out.println("Authentication failed. " + e.getMessage());
e.printStackTrace();
}

2.4.12 ユーザーの削除

次のコード・サンプルでは、ユーザーの削除方法を示します。

try {
DeleteOptions deleteOpts = new DeleteOptions();

uMgr.deleteUser(principal, deleteOpts);

System.out.println("Deleted user " + principal.getName());

} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}

2.4.13 グループの作成

次のコード・サンプルでは、グループの作成方法を示します。

Principal principal = null;

List<Attribute> attrs = new ArrayList<Attribute>();
attrs.add(new Attribute("name", "test1_group1"));
attrs.add(new Attribute("description", "created test group 1"));
attrs.add(new Attribute("displayname", "test1 group1"));
try {
CreateOptions createOpts = new CreateOptions();

principal = gMgr.createGroup(attrs, createOpts);

System.out.println("Created group " + principal.getName());
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}

2.4.14 グループの検索

次のコード・サンプルでは、グループの検索方法を示します。

public void searchGroups() {

try {
SearchFilter filter = new SearchFilter("name",
SearchFilter.Operator.BEGINS_WITH, "test");

SearchOptions searchOpts = new SearchOptions();
searchOpts.setPageSize(10);

ResultSet<Group> sr = gMgr.searchGroups(filter, searchOpts);
while (sr.hasMore()) {
Group group = sr.getNext();
System.out.println(group.getSubjectName());
}

} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}

2.4.15 管理チェーンの取得

次のコード・サンプルでは、管理チェーンの取得方法を示します。

try {
ReadOptions readOpts = new ReadOptions();
User user = uMgr.searchUser("tuser1", readOpts);

SearchOptions searchOpts = new SearchOptions();
searchOpts.setPageSize(10);
int nLevels = 0;

ResultSet<User> sr  = user.getManagementChain(nLevels, searchOpts);
while (sr.hasMore()) {
User u = sr.getNext();
System.out.println(u.getSubjectName());
}

} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}

2.4.16 ユーザーのReporteeの取得

次のコード・サンプルでは、ユーザーのReporteeの取得方法を示します。

// Get Reportees with target search filter
public void getReportees() {

try {
ReadOptions readOpts = new ReadOptions();
User user = uMgr.searchUser("tuser1", readOpts);

SearchOptions searchOpts = new SearchOptions();
searchOpts.setPageSize(20);
int nLevels = 0;

// get all the direct/indirect reporting of tuser1 who are
"developers"
SearchFilter filter = new SearchFilter("title",
SearchFilter.Operator.CONTAINS, "developer");
ResultSet<User> sr  = user.getReportees(nLevels, filter, searchOpts);
while (sr.hasMore()) {
User u = sr.getNext();
System.out.println(u.getSubjectName());
}

} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}

2.4.17 グループへのメンバーの追加

次のコード・サンプルでは、グループにメンバーを追加します。

try {
ReadOptions readOpts = new ReadOptions();
User user = uMgr.searchUser("tuser1", readOpts);
Group group = gMgr.searchGroup("test1_group1", readOpts);

ModifyOptions modOpts = new ModifyOptions();
user.addMemberOf(group, modOpts);

System.out.println("added tuser1 as a member of test1_group1");

} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}

2.4.18 グループからのメンバーの削除

次のコード・サンプルでは、グループからメンバーを削除します。

try {
ReadOptions readOpts = new ReadOptions();
User user = uMgr.searchUser("tuser1", readOpts);
Group group = gMgr.searchGroup("test1_group1", readOpts);

ModifyOptions modOpts = new ModifyOptions();
group.deleteMember(user, modOpts);

System.out.println("deleted tuser1 from the group test1_group1");

} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}

2.4.19 ユーザーがメンバーとなっているすべてのグループの取得

次のコード・サンプルでは、ユーザーがメンバーとなっているグループをすべて取得します。

try {
ReadOptions readOpts = new ReadOptions();
User user = uMgr.searchUser("tuser1", readOpts);

SearchOptions searchOpts = new SearchOptions();
searchOpts.setPageSize(10);
int nLevels = 0;

ResultSet<Group> sr  = user.getMemberOfGroups(nLevels, null,
searchOpts);
while (sr.hasMore()) {
Group group = sr.getNext();
System.out.println(group.getSubjectName());
}

} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}

3 ArisID APIの使用

この章では、Identity Governance Framework ArisID API (ArisID API)のアーキテクチャと主要な機能について説明します。ArisID APIは、エンタープライズ開発者とシステム設計者に、複数のアイデンティティ・プロトコルを使用したアイデンティティ対応のアプリケーションを作成するためのライブラリを提供します。ArisID APIでは、開発者は、Client Attribute Requirements Markup Language (CARML)を使用して、アイデンティティの属性、ロールおよび検索フィルタの要件を指定できます。この章の内容は次のとおりです。

- 第3.1項「ArisID APIについて」

- 第3.2項「ArisID APIの構成」

- 第3.3項「設計に関する推奨事項」

- 第3.4項「ArisID APIを使用したアプリケーションの開発」

- 第3.5項「IDXユーザーとロールBeanを使用したサンプル・アプリケーション」

3.1 ArisID APIについて

Identity Governance Framework ArisID APIは、すべてのアイデンティティ情報交換の受渡しに使用される共通のコア・サービスを表します。正式な名称ではありませんが、ArisID APIは、開発者からアイデンティティBeanと呼ばれることが多くあります。

11gリリース2(11.1.2)のArisID APIは、次に提案されている構成のサブセットです。

http://www.openliberty.org/wiki/index.php/ArisID_Configuration.

Oracle WebLogic ServerとOracle Identity Managementをインストールしてある場合、このAPIを使用したアプリケーションの開発に必要なjarファイルはすべて、コンピュータにすでにインストールされています。

関連項目:

- Oracle Identity Managementのインストールの詳細は、『Oracle Fusion Middleware Oracle Identity Managementインストレーション・ガイド』を参照してください。

- JDeveloperとその拡張機能のインストールの詳細は、『Oracle Fusion Middleware Oracle JDeveloperインストレーション・ガイド』を参照してください。

Identity Governance Frameworkオープン・ソースAPI jarファイルは次のとおりです。

- openliberty.arisId_1.1.jar: 属性のセットを含むアイデンティティ・サブジェクトの取得に使用されるライブラリ関数とプロバイダを含んだコアArisID APIを提供します。詳細は、http://arisid.sourceforge.net/javadocs/arisId_1.1_javadoc/を参照してください。

- org.openliberty.arisIdBeans_1.1.jar: ArisID APIに加えてJavaオブジェクトの抽象化を提供するArisID Beanを提供します。これらによって、ArisID APIのトランザクション型アプローチをオブジェクトまたはBean型のアプローチに変換します。詳細は、http://arisid.sourceforge.net/javadocs/arisId_1.1_javadoc/を参照してください。

ArisID API jarファイルは次のとおりです。

- idxuserrole.jar: 標準的なユーザーとロールのアイデンティティの読取り専用操作を提供します。このjarは、標準のidxuserrole.xml CARMLファイルから生成されます。詳細は、『Oracle Fusion Middleware Identity Governance Framework IDXUserRole Java APIリファレンス』を参照してください。

- userrole.jar: アイデンティティ情報を更新するためのユーザーとロールのアイデンティティ読取り/書込み操作を提供します。詳細は、『Oracle Fusion Middleware Identity Governance Framework UserRole APIリファレンス』を参照してください。

- arisId-stack-ovd.jar: このjarファイルはOracle Virtualizationライブラリを使用したIAttrSvcStackインタフェースの実装で、異なるバックエンドに接続し、アイデンティティ・ストア・エンティティの抽象ビューを提供します。

ArisID Beanによって、CARML対話の初期化とアクセスに必要なJava APIが提供されます。Beanジェネレータでは、Apache Velociyを使用してCARMLファイル内の各エンティティに対するjavaファイルのセットを生成します。CARMLファイルは、アプリケーションの属性使用要件を記述する宣言型のドキュメントです。ArisID Beanは、jarファイルidxuserrole.jarおよびuserrole.jar内にあります。標準のArisID Beanがニーズを満たさない場合、CARMLファイルを作成し、Identity Governance Framework ArisID JDeveloper拡張のBeanジェネレータを使用して、新たにArisID Beanを生成できます。

次の図に、ArisID APIアーキテクチャの概要を示します。

図3-1 IGF ArisID APIアーキテクチャ

「図3-1 IGF ArisID APIアーキテクチャ」の説明

3.2 ArisID APIの構成

Identity Governance Framework ArisID拡張では、作成 > 変更 > テスト > デプロイといった基本的な開発プロセスがサポートされます。作成では、新規JDeveloperプロジェクトの開始とCARMLファイルの作成が必要です。CARMLエディタを使用して、環境に合せてCARML XMLファイルを変更します。アプリケーションのテストは、LDAPディレクトリ・サーバーが組み込まれたOracle WebLogic Serverで行えます。

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

- CARMLファイルの構成

- アイデンティティ・リポジトリの構成

- マッピング・ファイルの構成

3.2.1 CARMLファイルの構成

CARMLファイルidxuserrole.xml(読取り専用操作)とuserrole.xml(読取り専用および読取り/書込み操作)を確認して、既存のArisID Beanがアプリケーションのニーズを満たすかどうかを判断します。これらのファイルは、DOMAIN_HOME/config/fmwconfig/carmlにあります。追加属性または他のカスタマイズが必要な場合、第3.4項「ArisID APIを使用したアプリケーションの開発」に記載のように、新たにCARMLファイルを作成してBeanを生成します。

3.2.2 アイデンティティ・リポジトリの構成

ArisID Beanによって使用されるアイデンティティ・リポジトリを使用可能にする必要があります。LDAPベースのディレクトリ・サーバーが組み込まれたOracle WebLogic Serverまたは11gのOracle Virtual Directoryでサポートされている任意のLDAPディレクトリを使用できます。ArisID APIは、Oracle Platform Security Servicesと統合されています。Oracle Platform Security Servicesに構成されているLDAPベースのアイデンティティ・ストアに自動的に接続します。Oracle Platform Security Servicesでサポートされているアイデンティティ・ストアの詳細は、「システム要件と動作保証情報」を参照してください。

Oracle Platform Security Servicesの詳細は、『Oracle Fusion Middlewareアプリケーション・セキュリティ・ガイド』を参照してください。

Oracle Platform Security Servicesアイデンティティ・ストアとは異なるアイデンティティ・ストアを使用する必要がある場合、次のシステム・プロパティを設定します。

igf.ovd.config.dir=DOMAIN_HOME/config/fmwconfig/arisidprovider/conf

次に、adapters.os_xmlファイルを編集して、接続先のディレクトリのhost、portおよび資格証明を含めます。igf.ovd.config.dirプロパティは、adapaters.os_xmlおよび適切に設定された他の構成ファイルを含む任意のディレクトリに設定できます。

OpenLDAPの場合、Role.MEMBERは次のAPIに必須の属性です。

- createRole(List<PropertyValue> attrVals, Map<String,Object> appCtxMap)

- createRole(List<PropertyValue> attrVals)

入力attrValsリストにRole.MEMBERが含まれていない場合、ロールの作成は失敗します。

3.2.3 マッピング・ファイルの構成

CARMLファイルが作成されている場合、対応するマッピング・ファイルは同じ場所に作成されます。デフォルトのマッピング・ファイルには、Oracle WebLogic Serverに組み込まれているディレクトリ・サーバー(Oracle Platform Security Servicesのデフォルト・アイデンティティ・ストア)に固有の属性詳細が含まれています。デフォルトのCARMLファイルとOracle Platform Security Servicesアイデンティティ・ストアを使用する場合、マッピングを構成する必要ばありません。Oracle Platform Security Servicesの構成パラメータは、マッピング・ファイルのパラメータをオーバーライドします。

追加属性を使用して独自のCARMLファイルを作成する場合、またはOracle Platform Security Servicesアイデンティティ・ストア以外のストアを使用する場合、マッピング・ファイルを編集する必要があります。詳細は、第3.4項「ArisID APIを使用したアプリケーションの開発」を参照してください。

3.3 設計に関する推奨事項

デフォルトのCARMLファイルとマッピング・ファイルには、デプロイ・シナリオについて特定の想定がなされています。デプロイ要件によっては、これらの詳細を変更する必要がある場合があります。この項では、変更可能な構成パラメータについて説明します。

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

- LoginIDの選択

- UniqueKeyの選択

- 複数言語サポートの指定

- 大規模な結果の処理

- アプリケーションの保護

- タイムアウト間隔の構成

3.3.1 LoginIDの選択

デフォルトの構成では、ユーザー・エントリを識別するための一意の識別子としてemailが使用されます。ユーザーの検索時、検索に想定されているデフォルトの属性はemailです。次に例を示します。

SearchUser( String uniqueid,  Map<String, Object>)

パフォーマンス上の理由から、一意の識別子として使用される属性は、バックエンドで検索可能な属性である必要があります。アプリケーションが選択したuniquekeyとバックエンドの属性との間のマッピングは、構成時に処理されます。これは、Oracle Virtual Directoryマッピングでの構成です。HashMapを使用して、操作の実行時に使用するオプションのコンテキスト情報を指定します。現在のリリースでは、次のオプションがサポートされます。

- 検索を実行するプリンシパル・ユーザー: (ArisIdConstants.APP_CTX_AUTHUSER, (Principal)user)

- 言語の制約(ある場合): (ArisIdConstants.APP_CTX_LOCALE, "fr")

- ページネーション・サポート(ある場合): (ArisIdConstants.APP_CTX_PAGESIZE, 10)

3.3.2 UniqueKeyの選択

アプリケーションで、アイデンティティ・リポジトリのバックエンドからアクセスされるエントリをアプリケーション固有のリポジトリに格納することがあります。このような場合、永続化する属性を慎重に検討する必要があります。たとえば、バックエンドがLDAPベースのリポジトリの場合、GUID属性がLDAPベースのバックエンドで唯一の一意のキーであるため、永続化属性としてこれを使用します。他のLDAP属性はすべて変更可能です。

バックエンドがリレーショナル・データベースの場合、一意性制約が適用される属性を一意キーとして選択します。これは、ArisIDマッピング・プロパティ・ファイルで指定できます。一意キーに基づいてユーザーを検索するメソッドは次のとおりです。

searchUserOnUniqueKey(String UniqueKey, Map<String,Object>)

HashMapを使用して、操作の実行時に使用するオプションのコンテキスト情報を指定します。現在のリリースでは、次のオプションがサポートされます。

- 検索を実行するプリンシパル・ユーザー: (ArisIdConstants.APP_CTX_AUTHUSER, (Principal)user)

- 言語の制約(ある場合): (ArisIdConstants.APP_CTX_LOCALE, "fr")

- ページネーション・サポート(ある場合): (ArisIdConstants.APP_CTX_PAGESIZE, "10")

3.3.3 複数言語サポートの指定

ロケール固有の結果を必要とするアプリケーション向けに複数言語サポート(MLS)が提供されます。属性と適切なMLSコードは、ArisIDプロパティ・ファイルのmultiLanguageAttributes要素に格納されます。

<multiLanguageAttributes>…</multiLanguageAttribute>

displaynameは、最もよく使用される複数言語属性であるため、デフォルトで複数言語属性として構成されています。必要に応じて他の属性をArisIDマッピング・ファイルに追加できます。

制限

引数としてロケールが指定されるAPIでは、ArisIDプロパティ・ファイルに<multiLanguageAttributes>としてリストされている、ロケール固有の値を持つすべての属性に対してロケール固有の値が返されます。他の属性についてはすべて、格納されているデフォルト値が返されます。

バックエンドのシステムでは、データはISO-3166に準拠した形式で返されます。たとえば、(英語の他に)フランス語のロケールがある場合、cn属性に対してcn,:frとして格納されます。クライアント・アプリケーションのロケールは、プロパティHashMapにArisIdConstants.APP_CTX_LOCALE, "fr"と指定し、ArisIDプロパティ・ファイルにcnをmultiLanguageAttributeとして含め、この属性をマップします。

3.3.4 大規模な結果の処理

アプリケーションでアイデンティティ・データにアクセスする場合、検索の結果セットが大きすぎてアプリケーションで処理できない場合があります。そのような場合、管理可能なサイズのページに結果を分割することができます。これは、ページで返されるオブジェクトの数を定義することで行います。

次の例に、標準的な使用法を示します。

RoleManager rm = new RoleManager(env);
List<PropertyFilterValue> attrFilters = new  ArrayList<PropertyFilterValue>();
attrFilters.add(new PropertyFilterValue(Role.NAME, "admin", AttributeFilter.OP_CONTAINS));

HashMap<String,Object> map = new HashMap<String,Object>();
map.put("ArisIdConstants.APP_CTX_PAGESIZE","2");
SearchResults<Role> sr = rm.searchRolesbyPage(attrFilters, map);

while(sr.hasMore())
{
List<Role> roles = sr.getNextSet();

for (int i=0; i<roles.size(); i++)
//do the operations with roles.get(i)
}

3.3.5 アプリケーションの保護

ターゲット・システムでの作成、読取り、更新および削除(CRUD)操作の実行に2つのセキュリティ・シナリオを使用できます。これらを次に示します。

- ドメイン・レベルの資格証明

- アプリケーション・レベルの資格証明

このリリースでは、プロキシ認証はサポートされていません。

3.3.5.1 ドメイン・レベルの資格証明

このシナリオでは、ドメイン内のすべてのアプリケーションで共通の資格証明を使用してターゲット・システムに接続し、その資格証明で操作を実行します。アプリケーションは、ターゲット・システムにフットプリントを保持しません。

LDAPアダプタの構成ファイルadapters.os_xmlには、バックエンド・ディレクトリに接続するための資格証明およびホストとポートの詳細が含まれています。初期化時に他の資格証明を指定しない場合、アプリケーションはLDAPアダプタの構成ファイル内の資格証明を使用してターゲット・システムに接続します。

プロキシ・ユーザー(ログイン・ユーザーID)がAPIのアプリケーション・コンテキストで指定されていない場合、ArisID操作は、LDAPアダプタの構成ファイル内にある資格証明を使用して実行されます。

アプリケーションが共通の資格証明を使用して接続する場合、認可されたユーザーについてのみデータを表示したり、変更するようアプリケーション自体にセキュリティを組み込む必要があります。

例3-1 コード・サンプル: adapters.os_xml

LDAPアダプタの構成ファイルadapters.os_xmlは、バックエンド・ディレクトリへの接続にドメイン・レベルのユーザーIDと暗号化されたパスワードを使用するよう構成されています。次に示すのは、adapters.os_xmlのスニペットです。

<binddn>cn=admin</binddn>
<bindpass>{OMASK}C2QXW1Nmf+s=</bindpass>

ArisID APIの初期化時、資格証明を指定しません。

Map env = new HashMap();
// Do not set UserManager.SECURITY_PRINCIPAL & SECURITY_CREDENTIALS
UserManager uMgr  = new UserManager(env);
…
…
// Search Operation (with no proxy user in app context)
List<PropertyFilterValue> attrFilters = new ArrayList<PropertyFilterValue>();
attrFilters.add(new PropertyFilterValue("User.FIRSTNAME", "app1", AttributeFilter.OP_CONTAINS));
attrFilters.add(new PropertyFilterValue("User.LASTNAME", "user1", AttributeFilter.OP_BGNSWITH));
Map<String, Object> appCtx = null;
users = um.searchUsers(attrFilters, appCtx);

3.3.5.2 アプリケーション・レベルの資格証明

このシナリオでは、各アプリケーションでアプリケーション・レベルの資格証明を使用してターゲット・システムに接続し、その資格証明でCRUD操作を実行します。

この場合、ArisID APIの初期化時にアプリケーションのユーザーIDとパスワードを指定します。そうすると、アプリケーションはそれらの資格証明を使用してターゲット・システムに接続します。

プロキシ・ユーザーがAPIのアプリケーション・コンテキストに指定されていない場合、アプリケーションの資格証明を使用してArisID操作が実行されます。

この使用例には、次の機能があります。

- 各アプリケーションは、ターゲット・システムのデータの表示および更新を行うための異なる権限を持ちます。

- ターゲット・システムで各アプリケーションによって行われる変更を監査できます。

例3-2 コード・サンプル: adapters.os_xml

LDAPアダプタの構成ファイルadapters.os_xmlは、バックエンド・ディレクトリへの接続にドメイン・レベルのユーザーIDと暗号化されたパスワードを使用するよう構成されています。次に示すのは、adapters.os_xmlのスニペットです。

<binddn>cn=admin</binddn>
<bindpass>{OMASK}C2QXW1Nmf+s=</bindpass>

ArisID APIの初期化時、アプリケーションのユーザー資格証明を指定します。

Map env = new HashMap();
env.put(UserManager.SECURITY_PRINCIPAL, "cn=app1_user,cn=users,dc=oracle,dc=com");
env.put(UserManager.SECURITY_CREDENTIALS, "mypassword");
UserManager uMgr  = new UserManager(env);
…
// Search Operation (with no proxy user in app context)
List<PropertyFilterValue> attrFilters = new ArrayList<PropertyFilterValue>();
attrFilters.add(new PropertyFilterValue("User.FIRSTNAME", "app1", AttributeFilter.OP_CONTAINS));
attrFilters.add(new PropertyFilterValue("User.LASTNAME", "user1", AttributeFilter.OP_BGNSWITH));Map<String, Object> appCtx = null;
users = um.searchUsers(attrFilters, appCtx);

3.3.6 タイムアウト間隔の構成

デフォルトの接続/読取りタイムアウトは15秒に設定されています。たとえば、IdentityStoreのLDAP操作に15秒以上かかる場合、その操作はタイムアウトし、IGFでは次の例外が発生します。

org.openliberty.arisid.stack.ConnectionException

IdentityStoreに多数のエントリがあり、「次を含む」というフィルタを使用してページング/ソートで検索すると、これらの問合せはタイムアウトする場合があります。

タイムアウト値を0(タイムアウトなし)に設定し、プール・サイズを20まで増やすことをお薦めします。アプリケーションのプリファレンスにタイムアウト間隔がある場合は、0より大きい値を設定します。

タイムアウト間隔を構成する手順は、次のとおりです。

1. 次のWLSTコマンドを実行し、すべてのアダプタをリストします。

listAdapters()

2. 各アダプタに対して次のコマンドを実行し、timeoutおよびmaxpoolsizeを設定します。

1. modifyLDAPAdapter('<ADAPTER NAME>', 'OperationTimeout', 0)

2. modifyLDAPAdapter('<ADAPTER NAME>', 'MaxPoolSize', 20)

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

3.4 ArisID APIを使用したアプリケーションの開発

この項では、Identity Governance Framework ArisID Oracle JDeveloper拡張を使用してアプリケーションを開発する方法について説明します。

関連項目:

『Oracle Fusion Middleware Oracle JDeveloperインストレーション・ガイド』

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

- JDeveloperでの開発

3.4.1 JDeveloperでの開発

ArisID APIを使用してアプリケーションを開発する場合、通常は次のタスクを実行します。

- Oracle JDeveloperでのArisIDプロジェクトの作成。

- CARMLファイルの作成と構成。

- ArisID Beanの生成。

- (オプション)マッピング・ファイルの編集。

Identity Governance Framework ArisID JDeveloper拡張は、複数の異なるパッケージに編成されています。パッケージは主に機能別に分かれています。最上位レベルでは、パッケージは、CARML概要エディタ、リレーションシップ・エディタ、マッピング・エディタ、Beanの生成およびプロジェクトの作成のためのものです。プロジェクトの作成には、プロジェクト構造の作成、プロジェクト・プロパティの管理およびCARMLファイルの作成に必要なすべてのクラスが含まれています。これらのパッケージの多くで共有される共通の要素は共通のままとされます。これは主に、共通のSwingコンポーネントとXML構造の解析/モデリングの抽象クラスです。

3.4.1.1 プロジェクトの作成

Identity Governance Framework ArisIDを使用するための最初のステップは、Oracle JDeveloperでプロジェクトを作成することです。Identity Governance Framework ArisID拡張をインストールすると、ArisID/IGFプロジェクトがJDevelolperのプロジェクト・ギャラリに追加されます。対応するプロジェクト・ウィザードによって、ArisIDに必要なライブラリの追加、ディレクトリ構造の作成、ArisID構成をテストするためのオプションの追加が行われます。次の図に、JDeveloperに表示されたサンプルのArisIDプロジェクトとディレクトリ構造を示します。

図igfdg_jdev_project.gifの説明

プロジェクトを作成する手順は、次のとおりです。

1. 「ファイル」、「新規」の順に選択して新規ギャラリを開きます。

2. 「カテゴリ」ツリーで「一般」を開き、「プロジェクト」を選択します。

3. IGF/ArisIDプロジェクトを選択して「OK」をクリックします。

4. 「プロジェクト名」ページでプロジェクトのプロジェクト名とディレクトリを指定します。

5. オプションで、追加のテクノロジを「選択可能」リストから「選択済」リストに移動します。

6. プロジェクトJava設定ページでプロジェクトのデフォルト・パッケージ、Javaソース・パスおよび出力ディレクトリを指定します。

7. IGF/CARML設定の構成ページで「J2SE」または「J2EE」を指定します。

8. 「終了」をクリックします。

3.4.1.2 CARMLファイルの作成と編集

属性と対話に関するアプリケーションの要件を宣言します。これらは、Client Attribute Requirements Markup Language (CARML)ファイルを使用して指定されます。CARMLエディタは、CARMLファイルの様々なフィールドを編集できるXMLエディタです。次の図に、CARMLエディタの「データ定義」セクションに表示されたサンプルCARML XMLファイルを示します。

図igfdg_carml_editor.gifの説明

新規CARMLファイルを作成するには、次のようにします。

1. 「ファイル」、「新規」の順に選択して新規ギャラリを開きます。

2. 「カテゴリ」ツリーで、「ビジネス層」ノードを開き、「セキュリティ」を選択します。

3. 「項目」リストで、クライアント属性要件(CARML)をダブルクリックしてダイアログを開きます。

4. CARMLファイルの作成ダイアログで、作成するファイルの名前を指定し、「OK」をクリックします。
用意されているテンプレートを使用できます。関連付けられている説明に、各テンプレート・ファイルの詳細が示されます。

CARMLファイル・エディタの「一般」ページが表示されます。

5. 「一般」ページの2つのフィールド(CARML一意インジケータおよびCARML説明)に値を指定します。

6. 「データ定義」ページでアプリケーションの属性要件を指定します。エンティティを追加し、エンティティのデータ対話を指定します。

7. データ対話ページで、アプリケーション・ベースの対話要件を指定します。データ対話ステップで、対話タイプのフィルタを指定します。

既存のCARMLファイルを編集するには、「プロジェクト」パネルで適切なファイルをダブルクリックし、CARMLファイル用概要エディタで開きます。

3.4.1.3 ArisID Beanの生成

CARMLファイルの編集が終了したら、アプリケーションで使用するArisID Beanを生成できます。ArisID APIに付属のスキーマ定義に従ってリレーション・ファイルを作成した場合、Beanの生成時に使用できます。

属性と対話の宣言をCARMLファイルに指定したら、対応するBeanクラスを生成してアプリケーションで使用できます。ファイルに複数のエンティティが定義されていて、エンティティ間のリレーションシップを指定する必要がある場合、リレーションシップ・ファイルを使用して指定できます。

Beanを生成するには、次のようにします。

1. 「プロジェクト」ペインで、Beanの生成に使用するCARMLファイルを強調表示します。

2. 右クリックしてアプリケーション・ナビゲータのCARMLファイル用コンテキスト・メニューを表示します。

3. ArisIDBeanの生成を選択します。
図igfdg_generate_beans.gifの説明

4. ArisIDBeanの生成ダイアログでパッケージを指定します。
図igfdg_dialog_genbeans.gifの説明

5. リレーション・ファイルを使用する場合、リレーションの使用を選択してリレーション・ファイルを指定するか、参照します。

6. 「OK」をクリックします。
これで、アプリケーションにこれらのBeanを組み込むことができます。

3.4.1.4 アプリケーションでのArisID Beanの使用方法

Identity Governance Framework ArisID API JDeveloper拡張では、始めにArisId Beanを作成します。これらのBeanは、他のJava Bean同様、開発者パースぺクティブです。標準のBeanのセマンティクスを使用してJavaアプリケーションから呼び出すことができます。これによって、開発者が使用するフレームワークに応じて様々な使用法が可能になります。

たとえば、ADF(オラクル社のJavaベースのWebアプリケーション・フレームワーク)を作成する場合、Beanをデータ・コントロールに変換してADFページにドラッグできます。これによって、開発者は、(検索、更新またはページでの表示用に)Beanを利用するアプリケーション同士を簡単に接続できます。コードを記述する必要はありません。

別の使用例は、アイデンティティ・データをWebサービスとしてOracle SOA Suiteから公開する開発者です。この場合、Beanには、Oracle Virtual DirectoryやOracle Directory Server Enterprise Editionなどのディレクトリ・サーバーに対するDSML問合せを使用するかわりにJavaコールアウトを使用してアクセスできます。SOAプロセス内で使用されるXML解析が少なくなるため、作成が容易になり、より効率的になります。

特定のプロトコルを意識せずにオブジェクトと属性の記述に注力することで、アイデンティティ情報のアクセスに関する開発者の生産性を向上させることができます。ArisIDにはプライバシとセキュリティが組み込まれているため、これは、セキュアで規格に準拠した方法で行われます。

3.4.1.5 マッピング・ファイルの編集

Oracle実装では、CARML宣言をOracle Virtual DirectoryなどのLDAPベースのサーバーにマップします。マッピング・エディタで、CARML属性をLDAP属性、オブジェクトクラスおよび検索パラメータにマップできます。サイトのLDAPベースのサーバー用にマッピング・ファイルをカスタマイズできます。LDAPの規定は、Internet Engineering Task ForceによってRFCの2251から2256に定義されています。詳細は、http://www.ietf.orgを参照してください。

マッピング・ファイルを編集するには、次のようにします。

1. 「プロジェクト」ペインでマッピング・ファイルを強調表示します。

2. ダブルクリックして、マッピング・ファイル概要エディタでファイルを開きます。
図igfdg_mapping_file.gifの説明

3. 「マッピング」ページで、変更するエンティティを強調表示します。

4. そのエンティティ用に変更するマッピング定義を強調表示します。

5. 必要に応じて、RDN属性、検索ベースおよび作成ベースを編集します。

6. オブジェクトクラス、フィルタ・オブジェクトクラス、パスワード属性および複数言語クラスを追加するには、対応する「追加」アイコンをクリックします。

7. 変更する他のエンティティについて、ステップ3から6を繰り返します。

8. 必要に応じて、「グローバル」ページでページング設定を変更します。

3.5 IDXユーザーとロールBeanを使用したサンプル・アプリケーション

次のサンプル・アプリケーションでは、IDXユーザー/ロールBeanを使用します。

3.5.1 SearchUsers.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="org.openliberty.arisid.*"%>
<%@page import="org.openliberty.arisidbeans.*"%>
<%@page import="oracle.igf.userrole.*"%>
<%@page import="java.util.*"%>
<%@page import="java.net.URI"%>
<%!public static UserManager uMgr = null;
{
try {
uMgr = new UserManager(null);
} catch (Exception e) {
e.printStackTrace();
}

}
%>
<html>
<head>
<title>Search Users</title>
<%

String firstname = request.getParameter("firstname");
String lastname = request.getParameter("lastname");
String telephone = request.getParameter("telephone");

List<PropertyFilterValue> attrFilters = new ArrayList<PropertyFilterValue>();
attrFilters.add(new PropertyFilterValue("firstname", firstname, AttributeFilter.OP_BGNSWITH));
attrFilters.add(new PropertyFilterValue("lastname", lastname, AttributeFilter.OP_BGNSWITH));
attrFilters.add(new PropertyFilterValue("telephone", telephone, AttributeFilter.OP_CONTAINS));

List<User> subjs = uMgr.searchUsers(attrFilters);

%>
</head>
<body>

<a href="SearchUsers.html">Home</a>
<center>List of Users with FirstName starting with "<%=firstname%>", LastName
starting with "<%=lastname%>" and TelephoneNumber containing
"<%=telephone%>"</center>

<%
Iterator<User> sIter = subjs.iterator();
while (sIter.hasNext()) {
User subj = sIter.next();

Map<String, IAttributeValue> vals = subj.getAllAttributes();
Iterator<IAttributeValue> iter = vals.values().iterator();
%>
<table border="0">
<tr>
<th>Item</th>
<th>Value</th>
</tr>
<%
while (iter.hasNext()) {
IAttributeValue val = iter.next();
String name = val.getNameIdRef();
String value = null;
if (val.size() > 0)
value = val.get(0);
if (value != null)
{
%>
<tr>
<td><%=name%></td>
<td><%=value%></td>
</tr>
<%
}
}
%>
</table>
<%
}
%>
<br>
<br>
<br>
<a href="SearchUsers.html">Home</a>
</body>
</html>

3.5.2 SearchUsers.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD><TITLE>Search Users</TITLE></HEAD>
<BODY>
<FORM METHOD=POST ACTION="SearchUsers.jsp">

First Name Starting with <INPUT TYPE=TEXT NAME=firstname SIZE=30><BR><BR>
Last Name Starting with <INPUT TYPE=TEXT NAME=lastname SIZE=30><BR><BR>
Telephone Number containing <INPUT TYPE=TEXT NAME=telephone SIZE=15><BR><BR>
<P><INPUT TYPE=SUBMIT>
</FORM>
</BODY>
</HTML>

4 アイデンティティ・ディレクトリAPIへの移行

この章では、ユーザーおよびロールAPIからアイデンティティ・ディレクトリAPIにアプリケーションを移行する方法を説明します。この章の内容は次のとおりです。

- 第4.1項「概要」

- 第4.2項「アプリケーションの移行」

- 第4.3項「ユーザーおよびロールAPIとIDS APIとの比較」

4.1 概要

『Oracle Fusion Middlewareアプリケーション・セキュリティ・ガイド』および『Oracle Fusion Middleware Oracle Platform Security ServicesユーザーおよびロールJava APIリファレンス』に記載されているユーザーおよびロールAPIを使用するアプリケーションがある場合、そのかわりにアイデンティティ・ディレクトリAPIを使用するよう変更できます。

アイデンティティ・ディレクトリAPIは、jps-configファイルからLDAPベースのアイデンティティ・ストアの確認を取得します。したがって、ユーザーおよびロールAPIからアイデンティティ・ディレクトリAPIにアプリケーションを移行する際、jps-configファイルの構成を変更する必要はありません。

ユーザーおよびロールAPIをプログラム的な構成で初期化するアプリケーションは、類似のメソッドを使用して、アイデンティティ・ディレクトリAPIを初期化できます。詳細は、第2.4.3項「メモリー内アイデンティティ・ディレクトリ・ハンドルの初期化と取得」を参照してください。

4.2 アプリケーションの移行

ユーザーおよびロールAPIからアイデンティティ・ディレクトリAPIに移行するアプリケーションでは、次のコード変更が必要です。

- APIの初期化

- UserManagerおよびGroupManagerのハンドルの取得

- 検索フィルタ

- CRUD操作

- ユーザー関連API

- ロール関連API

4.2.1 APIの初期化

プロセスは、IdentityStoreService.GetIdmStore()を使用してoracle.security.idm.IdentityStoreハンドルを取得する方法に類似しています。アイデンティティ・ディレクトリAPIは、IdentityStoreService.getIdentityStore()を使用してIdentityDirectoryハンドルを取得します。次に例を示します。

import oracle.igf.ids.IdentityDirectory;
import oracle.igf.ids.IDSException;
import oracle.security.jps.JpsContext;
import oracle.security.jps.JpsContextFactory;
import oracle.security.jps.service.idstore.IdentityStoreService;

// Get IdentityDirectory from JpsContext
JpsContext context = JpsContextFactory.getContextFactory().getContext();
IdentityStoreService idstore = (IdentityStoreService)
context.getServiceInstance(IdentityStoreService.class);
Identity Directory ids = idstore.getIdentityStore();

4.2.2 UserManagerおよびGroupManagerのハンドルの取得

ユーザー関連のCRUD操作はoracle.igf.ids.UserManagerを使用して、ロール関連のCRUD操作はoracle.igf.ids.GroupManagerを使用して実行できます。UserManagerおよびGroupManagerのハンドルは、IdentityDirectoryオブジェクトから取得できます。次に例を示します。

import oracle.igf.ids.UserManager;
import oracle.igf.ids.GroupManager;

// Get UserManager and GroupManager handles
UserManager uMgr = ids.getUserManager();
GroupManager gMgr = ids.getGroupManager();

4.2.3 検索フィルタ

簡易検索フィルタまたは複雑な検索フィルタの作成には、oracle.igf.ids.SearchFilterを使用します。次に例を示します。

import oracle.igf.ids.SearchFilter;

// Simple search filter for (firstname equals "john")

SearchFilter filter1 = new SearchFilter("firstname",
SearchFilter.Operator.EQUALS, "john");

// Complex search filter for
((title contains "manager") and (org equals "amer")) or
((title contains "senior manager") and (org equals "apac"))

SearchFilter filter = new SearchFilter(
SearchFilter.LogicalOp.OR,
new SearchFilter(SearchFilter.LogicalOp.AND,
new SearchFilter("manager", SearchFilter.Operator.CONTAINS,
"manager"),
new SearchFilter("org", SearchFilter.Operator.EQUALS, "amer")),
new SearchFilter(SearchFilter.LogicalOp.AND,
new SearchFilter("manager", SearchFilter.Operator.CONTAINS,
"senior manager"),
new SearchFilter("org", SearchFilter.Operator.EQUALS, "apac")));

4.2.4 CRUD操作

ユーザー、グループ、組織のエンティティおよび汎用エンティティに対する作成/読取り/更新/削除(CRUD)操作の実行については、次の各項で説明します。

- ユーザーの検索

- ユーザーの検索

- ユーザーの作成

- ユーザーの削除

- ユーザーの認証

- ユーザーの変更と関連エンティティの管理

4.2.4.1 ユーザーの検索

ユーザーの検索に使用されるAPIを次に示します。

- 指定されたprincipal識別子のユーザーを取得します。次に例を示します。

User getUser(Principal principal, ReadOptions opts)

- ユーザーを一意に識別する、指定されたid属性値と一致するユーザーを検索します。次に例を示します。

User searchUser(String id, ReadOptions opts)

- 指定された属性の名前および値と一致するユーザーを検索します。次に例を示します。

User searchUser(String attrName, String attrVal, ReadOptions opts)

- ユーザーを一意に識別する、指定されたGUID値と一致するユーザーを検索します。次に例を示します。

searchUserByGuid(String guid, ReadOptions opts)

4.2.4.2 ユーザーの検索

ユーザーを検索するAPIの例を次に示します。

ResultSet<User> searchUsers(SearchFilter filter, SearchOptions opts)

4.2.4.3 ユーザーの作成

ユーザーを作成するAPIの例を次に示します。

Principal createUser(List<Attribute> attrVals, CreateOptions opts)

4.2.4.4 ユーザーの削除

ユーザーを削除するAPIの例を次に示します。

- 指定されたprincipal識別子のユーザーを削除します。

void deleteUser(Principal principal, DeleteOptions opts)

- 指定されたid属性値のユーザーを削除します。

void deleteUser(String id, DeleteOptions opts)

4.2.4.5 ユーザーの認証

ユーザーを認証するAPIの例を次に示します。

- 指定されたid属性値と一致するユーザーを認証します。

User authenticateUser(String id, char[] password, ReadOptions opts)

- 指定されたprincipal識別子のユーザーを認証します。

boolean authenticateUser(Principal principal, char[] password)

4.2.4.6 ユーザーの変更と関連エンティティの管理

ユーザー属性を変更するAPIおよびその関連エンティティを取得するAPIは、UserManagerではなくUserオブジェクトにあります。

4.2.4.6.1 ユーザーの変更

ユーザーを変更するAPIの例を次に示します。

- ユーザーの属性を変更します。

void User.modify(List<ModAttribute> attrVals, ModifyOptions opts)

- ユーザーの属性値を設定します。

void User.setAttributeValue(String attrName, String attrVal, ModifyOptions opts)

4.2.4.6.2 関連エンティティの管理

エンティティを管理するAPIの例を次に示します。

- 管理チェーンを取得します。

ResultSet<User> getManagementChain(int nLevels, SearchOptions opts)

- 指定されたユーザーがこのユーザーの管理者であるかどうかを確認します。

boolean isManager(User user, boolean direct, ReadOptions opts)

- 指定されたユーザーをこのユーザーの管理者として設定します。

void setManager(User user, ModifyOptions opts)

- このユーザーのReporteeをすべて取得します。

ResultSet<User> getReportees(int nLevels,
SearchFilter targetFilter, SearchOptions opts)

- このユーザーがメンバーとして属している、指定されたフィルタ基準と一致するグループをすべて取得します。

ResultSet<Group> getMemberOfGroups(int
nLevels, SearchFilter targetFilter, SearchOptions opts)

- このユーザーが指定されたグループのメンバーであるかどうかを確認します。

boolean isMemberOf(Group group, boolean direct, ReadOptions opts)

- 指定されたグループのメンバーとしてこのユーザーを追加します。

void addMemberOf(Group group, ModifyOptions opts)

- 指定されたグループのメンバーからこのユーザーを削除します。

void deleteMemberOf(Group group, ModifyOptions opts)

4.3 ユーザーおよびロールAPIとIDS APIとの比較

ユーザーおよびロールAPIとアイデンティティ・ディレクトリAPIの違いについて、次のトピックで説明します。

- ユーザー関連API

- ロール関連API

4.3.1 ユーザー関連API

表4-1に、ユーザー関連APIのメソッドと、対応するアイデンティティ・ディレクトリAPIのメソッドとの比較を示します。

表4-1 ユーザー関連APIとアイデンティティ・ディレクトリAPIとの比較

機能

ユーザー/ロールAPIのメソッド

アイデンティティ・ディレクトリAPIのメソッド

ユーザーの作成

User UserManager.createUser(String name, char[] password)

User UserManager.createUser(String name, char[] password, PropertySet pset)

Principal UserManager.createUser(List<Attribute> attrVals, CreateOptions opts)

ユーザーの削除

void UserManager.dropUser(UserProfile user)

void UserManager.dropUser(User user);

void UserManager.deleteUser(Principal principal, DeleteOptions opts)

void UserManager.deleteUser(String id, DeleteOptions opts)

ユーザーの認証

User UserManager.authenticateUser(String user_id, char[] passwd)

User UserManager.authenticateUser(User user, char[] passwd)

User UserManager.authenticateUser(String user_id, String authProperty, char[] passwd)

User UserManager.authenticateUser(String id, char[] password, ReadOptions opts)

boolean UserManager.authenticateUser(Principal principal, char[] password)

ユーザーの作成がサポートされているかどうかのチェック

boolean UserManager.isCreateUserSupported()

boolean UserManager.getCapabilities().isCreateCapable()

ユーザーの変更がサポートされているかどうかのチェック

boolean UserManager.isModifyUserSupported()

boolean UserManager.getCapabilities().isUpdateCapable()

ユーザーの削除がサポートされているかどうかのチェック

boolean UserManager.isDropUserSupported()

boolean UserManager.getCapabilities().isDeleteCapable()

指定された検索基準によるユーザーの検索

SearchResponse IdentityStore.searchUsers(SearchParameters params)

ResultSet<User> UserManager.searchUsers(SearchFilter filter, SearchOptions opts)

名前/一意の名前/guidによるユーザーの検索

User IdentityStore.searchUser(String name)

User UserManager.searchUser(String id, ReadOptions opts)

User UserManager.searchUser(String attrName, String attrVal, ReadOptions opts)

特定のユーザー・オブジェクトのリポジトリにユーザーが存在するかどうかのチェック

boolean IdentityStore.exists (User user)

User.getPrincipal() 次のメソッドがnullを返す場合、ユーザーは存在しません。それ以外の場合は存在します。

User getUser(Principal principal, ReadOptions opts)

単純な検索フィルタ(1つの名前、タイプおよび値に基づいた検索)

SimpleSearchFilter

SearchFilter(String propertyName, Operator op, String propertyVal)

複雑な検索フィルタ(フィルタ条件とネストしたフィルタを使用した複数の属性に基づいた検索)

ComplextSearchFilter

SearchFilter(LogicalOp op, SearchFilter... searchFilters)

指定されたプロパティ名に対するプロパティ値の取得

String User.getPropertyVal(String propName)

ユーザー・ロールAPIはキャッシュから属性値をフェッチします。キャッシュにない場合、リポジトリからフェッチします。

String User.getAttributeValue(String attrName)

制限: リポジトリからすでにフェッチされているユーザー・オブジェクトから属性値を返します。

指定されたプロパティ名に対するユーザー・プロパティの取得

Property User.getProperty(String propName)

Attribute User.getAttribute(String attrName)

指定されたプロパティ名のセットに対するユーザー・プロパティの取得

Map User.getProperties()

Map<String, Attribute> User.getAllAttributes()

ユーザーのリポジトリからユーザー・プロパティをすべて取得します。

PropertySet User.getAllUserProperties()

Map<String, Attribute> User.getAllAttributes()

すべてのユーザー・プロパティ名のスキーマからの取得

List IdentityStore.getUserPropertyNames()

スキーマ内にあるすべてのプロパティの名前を返します。

List<String> UserManager.getEntityAttributes()

ユーザーのリポジトリ内の属性値の変更

void User.setProperty(ModProperty mprop)

void User.setAttributeValue(String attrName, String attrVal, ModifyOptions opts)

ユーザーのリポジトリ内の属性値のセットの変更

void User.setProperties(ModProperty[] modPropObjs)

void User.setProperties(LdapContext ctx, ModProperty[] modPropObjs)

void User.modify(List<ModAttribute> attrVals, ModifyOptions opts)

ユーザーの直接または間接のすべてのReporteeを取得します。

SearchResponse User.getReportees(boolean direct)

ResultSet<User> User.getReportees(int nLevels, SearchFilter targetFilter, SearchOptions opts)

ユーザーの管理チェーンの取得

List User.getManagementChain(int max, String upToManagerName, String upToTitle)

ResultSet<User> User.getManagementChain(int nLevels, SearchOptions opts)

List<User> User.getManagementChain(int nLevels, String manager, String title, SearchOptions opts)

バイナリ属性の取得/設定

使用可能

ユーザー/ロールAPIのプロパティでは、バイナリ属性がサポートされます。

byte[] user.getJPEGPhoto()

void user.setJPEGPhoto(String imgpath)

Base64でエンコードした値を返します。

値を設定する際、ModAttributeを作成するには、Base64でエンコードした値またはbyte[]を使用できます。

レルムの選択

使用可能

env.put(OIDIdentityStoreFactory.RT_SUBSCRIBER_NAME, "<realm dn>");

IdentityStoreFactory.getIdentityStoreInstance(env);

これは、IDSオペレーション構成の一部です。APIレベルでは、searchbaseおよびcreatebaseは同様に指定できます。

4.3.2 ロール関連API

表4-2に、ロール関連APIのメソッドと、対応するアイデンティティ・ディレクトリAPIのメソッドとの比較を示します。

表4-2 ロール関連APIとアイデンティティ・ディレクトリAPIとの比較

機能

ユーザー/ロールAPIのメソッド

アイデンティティ・ディレクトリAPIのメソッド

ロールの作成

Role RoleManager.createRole(String name, int scope)

Role RoleManager.createRole(String name)

Principal GroupManager.createGroup(List<Attribute> attrVals, CreateOptions opts)

ロールの削除

void RoleManager.dropRole(RoleProfile role)

void RoleManager.dropRole(Role role)

void GroupManager.deleteGroup(Principal principal, DeleteOptions opts)

ロールの作成がサポートされているかどうかのチェック

boolean RoleManager.isCreateRoleSupported()

boolean GroupManager.getCapabilities().isCreateCapable()

ロールの変更がサポートされているかどうかのチェック

boolean RoleManager.isModifyRoleSupported()

boolean GroupManager.getCapabilities().isUpdateCapable()

ロールの削除がサポートされているかどうかのチェック

boolean RoleManager.isDropRoleSupported()

boolean GroupManager.getCapabilities().isDeleteCapable()

グループがユーザーによって所有されているか

boolean RoleManager.isGranted(Role parent, Principal principal)

boolean Group.isMember(User user, boolean direct, ReadOptions opts)

boolean User.isMemberOf(Group group, boolean direct, ReadOptions opts)

グループがユーザーによって所有されているか

boolean RoleManager.isOwnedBy(Role parent, Principal principal)

boolean User.isOwnerOf(Group group, boolean direct, ReadOptions opts)

グループがユーザーによって管理されているか

boolean RoleManager.isManagedBy(Role parent, Principal principal)

サポートされていません。

ロールの直接または間接のすべてのメンバーの取得

SearchResponse Role.getGrantees(SearchFilter filter, boolean direct)

ResultSet<User> Group.getMembers(int nLevels, SearchFilter targetFilter, SearchOptions opts)

ユーザーをメンバーとしてロールに追加します。

void RoleManager.grantRole(Role parent, Principal principal)

void Group.addMember(User user, ModifyOptions opts)

ロールのメンバーからユーザーを削除

void RoleManager.revokeRole(Role parent, Principal principal)

void Group.deleteMember(User user, ModifyOptions opts)

特定のロールの直接または間接のすべての所有者の取得

SearchResponse Role.getOwners(SearchFilter filter, boolean direct)

SearchResponse Role.getOwners(SearchFilter filter)

ResultSet<User> Group.getOwners(int nLevels, SearchFilter targetFilter, SearchOptions opts)

ユーザーを所有者としてロールに追加

void Role.addOwner(Principal principal)

void Group.addOwner(User user, ModifyOptions opts)

ロールの所有者からユーザーを削除

void Role.removeOwner(Principal principal)

void Group.deleteOwner(User user, ModifyOptions opts)

ロールの直接または間接のすべての管理者の取得

SearchResponse Role.getManagers(SearchFilter filter, boolean direct)

SearchResponse Role.getManagers(SearchFilter filter)

サポートされていません。

ユーザーをロールの管理者として追加します。

void Role.addManager(Principal principal)

サポートされていません。

ロールの管理者からユーザーを削除します。

void Role.removeManager(Principal principal)

サポートされていません。

ロールのプロパティの取得

Property Role.getProperty(String propName)

注意: ユーザー・ロールAPIはキャッシュからこれらの属性値をフェッチします。キャッシュにない場合、リポジトリからフェッチします。

Attribute Group.getAttribute(String attrName)

ロール・タイプの確認

Role.isApplicationRole

Role.isEnterpriseRole

Role.isSeeded

サポートされていません。

指定された検索基準に対するロールの検索

SearchResponse IdentityStore.searchRoles(int scope, SearchParameters params)

ResultSet<Group> GroupManager.searchGroups(SearchFilter filter, SearchOptions opts)

名前/一意の名前/guidによるロールの検索

Role IdentityStore.searchRole(int searchType, String value)

Group searchGroup(String id, ReadOptions opts)

Group searchGroup(String attrName, String attrVal, ReadOptions opts)

指定されたフィルタに対するユーザーとロールの検索

SearchResponse IdentityStore.search(SearchParameters params)

次の異なるメソッドを使用できます。

UserManager.searchUsers

GroupManager.searchGroups

ユーザー/グループに割り当てられたすべてのロールを取得します。

SearchResponse getGrantedRoles(Principal principal, boolean direct)

ResultSet<Group> User.getMemberOfGroups(int nLevels, SearchFilter targetFilter, SearchOptions opts)

ResultSet<Group> Group.getMemberOfGroups(int nLevels, SearchFilter targetFilter, SearchOptions opts)

ユーザー/グループが所有しているすべてのロールを取得します。

SearchResponse getOwnedRoles(Principal principal, boolean direct)

ResultSet<Group> User.getOwnedGroups(int nLevels, SearchFilter targetFilter, SearchOptions opts)

ResultSet<Group> Group.getOwnedGroups(int nLevels, SearchFilter targetFilter, SearchOptions opts)

ユーザー/グループが管理しているすべてのロールを取得します。

SearchResponse getManagedRoles(Principal principal, boolean direct)

サポートされていません。

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