2 アイデンティティ・ディレクトリAPIの使用
次の各トピックで、Identity Governance Framework、アイデンティティ・ディレクトリAPIおよびIdentity Directory Serviceのアーキテクチャと主要な機能について説明します。
- アイデンティティ・ディレクトリAPIの概要
アイデンティティ・ディレクトリAPIは、アイデンティティ管理アプリケーションがアイデンティティ情報にアクセスし、管理するためのサービスを提供します。柔軟性のあるこのAPIは、クライアントによって完全に構成可能であり、標準および固有のスキーマを持つ様々なアイデンティティ・ストアをサポートします。さらに堅牢であり、高可用性およびフェイルオーバー・サポートの両方を提供します。 - アイデンティティ・ディレクトリAPIの構成
アイデンティティ・ディレクトリAPIは、異なるアイデンティティ・ストアに格納されているユーザーおよびグループ情報にアクセスし、それらを変更するためのインタフェースを提供します。アイデンティティ・ディレクトリの構成は、論理的なエンティティ構成、物理的なアイデンティティ・ストア構成、操作構成の組合せです。 - アイデンティティ・ディレクトリAPIの設計に関する推奨事項
アイデンティティ・ディレクトリAPIを作成する際に、念頭に置いておくべき重要な設計上のガイドラインがあります。 - アイデンティティ・ディレクトリAPIの使用例
アイデンティティ・ディレクトリAPIに関連する各種の操作を実行するには、次のサンプル・コードを使用します。
2.1 アイデンティティ・ディレクトリAPIの概要
アイデンティティ・ディレクトリAPIは、アイデンティティ管理アプリケーションがアイデンティティ情報にアクセスし、管理するためのサービスを提供します。柔軟性のあるこのAPIは、クライアントによって完全に構成可能であり、標準および固有のスキーマを持つ様々なアイデンティティ・ストアをサポートします。さらに堅牢であり、高可用性およびフェイルオーバー・サポートの両方を提供します。
このAPIは、Identity Governance Frameworkを使用し、Identity Governanceによるアイデンティティ情報の規制および制御がもたらすすべての利点を提供します。このAPIはJava EEおよびJava SEの両方のモードで使用できます。Identity Governance Frameworkの詳細は、Identity Governance Frameworkの概要を参照してください。
APIでサポートされるアクションは次のとおりです。
-
ユーザー、グループ、組織のエンティティおよび汎用エンティティに対する作成/読取り/更新/削除(CRUD)操作の実行
-
ユーザー・アカウント状態の取得操作
-
アイデンティティ・ディレクトリAPIの構成の共有
-
Oracle Internet Directory、Oracle Unified Directory、Oracle Directory Server EE、Active Directoryなどのディレクトリ・サーバーのサポート
Identity Directory Serviceには次のものが含まれます。
-
アイデンティティ・ディレクトリAPI
ドメイン・アイデンティティ・ストアであるディレクトリ・サーバー内でアイデンティティ情報にアクセスし、管理する方法を提供します。エンティティ定義、エンティティ・リレーションシップ、およびその物理的なアイデンティティ・ストアの詳細は、アイデンティティ・ディレクトリの構成APIまたはMbeanを使用して構成できます。ディレクトリ・サービス・インスタンスの機能は、ゲッター・メソッドを使用して問い合せることができます。
-
アイデンティティ・ディレクトリAPIの構成
アイデンティティ・ディレクトリAPIの構成には、論理的なエンティティ構成と物理的なアイデンティティ・ストア構成が含まれます。
この項では、次の項目について説明します。
- アイデンティティ・ディレクトリAPIについて
Identity Directory Serviceは、アイデンティティ管理製品がアイデンティティ・ディレクトリにアクセスし、管理するために使用する共通サービスです。Identity Directory Serviceの初期化にはアイデンティティ・ディレクトリAPIを使用します。 - Identity Directory Serviceのアーキテクチャ
アイデンティティ・ディレクトリ・サービスAPIを使用するには、アーキテクチャを理解し、アイデンティティの統合方法と使用方法を把握することが重要です。
親トピック: アイデンティティ・ディレクトリAPIの使用
2.1.1 アイデンティティ・ディレクトリAPIについて
Identity Directory Serviceは、アイデンティティ管理製品がアイデンティティ・ディレクトリにアクセスし、管理するために使用する共通サービスです。Identity Directory Serviceの初期化にはアイデンティティ・ディレクトリAPIを使用します。
Identity Directory Serviceは、異なるアイデンティティ・ストアに格納されているユーザーおよびグループ情報にアクセスし、それらを変更するためのインタフェースを提供します。アイデンティティ・ディレクトリはIdentity Directory Serviceのインスタンスであり、次のものが含まれています。
-
一意の名前 (IDS名)
-
論理的なエンティティ構成
-
物理的なアイデンティティ・ストア構成
アイデンティティ・ストア・サービスとも呼ばれるIdentity Directory Serviceの詳細は、Oracle® Fusion Middleware Oracle Platform Security Servicesによるアプリケーションの保護でアイデンティティ・ストア・サービスの概要に関する項を参照してください。
親トピック: アイデンティティ・ディレクトリAPIの概要
2.1.2 Identity Directory Serviceのアーキテクチャ
アイデンティティ・ディレクトリ・サービスAPIを使用するには、アーキテクチャを理解し、アイデンティティの統合方法と使用方法を把握することが重要です。
図2-1は、アイデンティティ・ディレクトリ・サービスの論理的なアーキテクチャを示します。
図2-2は、アイデンティティ・ディレクトリ・サービスのコンポーネント間のリレーションシップを示します。
親トピック: アイデンティティ・ディレクトリAPIの概要
2.2 アイデンティティ・ディレクトリAPIの構成
アイデンティティ・ディレクトリAPIは、異なるアイデンティティ・ストアに格納されているユーザーおよびグループ情報にアクセスし、それらを変更するためのインタフェースを提供します。アイデンティティ・ディレクトリの構成は、論理的なエンティティ構成、物理的なアイデンティティ・ストア構成、操作構成の組合せです。
論理的なエンティティ構成およびオペレーション構成は、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
この項では、次の項目について説明します。
- Identity Directory Serviceの論理的なエンティティ構成
アイデンティティ・ディレクトリの論理エンティティ構成に関連付けられている属性とプロパティを保守管理することが重要です。 - Identity Directory Serviceの物理的なアイデンティティ・ストア構成
必要に応じて使用できるように、アイデンティティ・ディレクトリについて構成項目の物理特性を把握し、文書化しておくことが重要です。 - Identity Directory Serviceのオペレーション構成
Identity Directory Serviceの構成項目に関連する機能上および操作上の観点を調べ、特定する必要があります。
親トピック: アイデンティティ・ディレクトリAPIの使用
2.2.1 Identity Directory Serviceの論理的なエンティティ構成
アイデンティティ・ディレクトリの論理エンティティ構成に関連付けられている属性とプロパティを保守管理することが重要です。
次の各トピックで、Identity Directory Serviceの論理的なエンティティ構成について説明します。
- 論理的なエンティティ構成のプロパティ
論理的なエンティティ構成のプロパティに留意する必要があります。 - 論理的なエンティティ構成の属性
- 論理的なエンティティ定義のプロパティ
論理的なエンティティ定義ごとに必要なプロパティに留意する必要があります。 - 論理的なエンティティ・リレーションシップのプロパティ
論理的なエンティティ・リレーションシップ定義ごとに必要なプロパティに留意する必要があります。
親トピック: アイデンティティ・ディレクトリAPIの構成
2.2.1.1 論理的なエンティティ構成のプロパティ
論理的なエンティティ構成のプロパティに留意する必要があります。
| 名前 | 説明 |
|---|---|
|
|
Identity Directory Serviceを一意に識別する名前です。 |
|
|
Identity Directory Serviceの詳細な説明です。 |
|
|
有効な値は |
|
|
Identity Directory Serviceの構成対象である特定のアプリケーションを指定するプロパティです(オプション)。 |
2.2.1.2 論理的なエンティティ構成の属性
次の表に、論理的なエンティティ属性を示します。
| 名前 | 説明 |
|---|---|
|
|
論理的な属性の名前です。 |
|
|
有効なデータ・タイプの値は、 |
|
|
論理的な属性の詳細な説明です。 |
|
|
デフォルトは |
|
|
デフォルトは |
注意:
12c (12.1.3)リリース以降、アイデンティティ・ディレクトリAPIは、エンティティ属性パススルーをサポートします。パススルーをサポートする場合、属性定義(論理的なエンティティ構成の属性で説明)およびエンティティ定義の下の属性参照(論理的なエンティティ定義のプロパティで説明)に各属性をすべて含める必要はありません。
IDS APIでは、追加、変更、リクエスト済属性、または検索フィルタ操作での任意の属性を許可します。エンティティ定義は、バックエンド・アイデンティティ・ストアとは異なる論理的な属性名を使用してエンティティ関係を定義するための、または属性のデフォルトのフェッチのための、属性の最小限のセットを保持できます。
入力属性がアイデンティティ・ストア・スキーマにない場合、IDS APIはアイデンティティ・ストアによってスローされたエラーを返します。
2.2.1.3 論理的なエンティティ定義のプロパティ
論理的なエンティティ定義ごとに必要なプロパティに留意する必要があります。
| 名前 | 説明 |
|---|---|
|
|
エンティティの名前。 |
|
|
有効なエンティティの値は、 |
|
|
エンティティを一意に識別する論理的な属性です。 |
|
|
このエンティティの作成が許可されている場合は |
|
|
このエンティティの変更が許可されている場合は |
|
|
このエンティティの削除が許可されている場合は |
|
|
このエンティティの検索が許可されている場合は |
|
|
次の詳細を含むエンティティ属性のリファレンスのリストです。
|
2.2.1.4 論理的なエンティティ・リレーションシップのプロパティ
論理的なエンティティ・リレーションシップ定義ごとに必要なプロパティに留意する必要があります。
| 名前 | 説明 |
|---|---|
|
|
エンティティ・リレーションシップの名前です。 |
|
|
有効なエンティティの値は、 |
|
|
エンティティ・リレーションシップの最初のエンティティの名前です。 |
|
|
最初のエンティティの属性です。この属性値は、リレーションシップの2番目のエンティティに関連します。 |
|
|
エンティティ・リレーションシップの2番目のエンティティの名前です。 |
|
|
2番目のエンティティの属性です。 |
|
|
エンティティ・リレーションシップが再帰的な場合は |
2.2.2 Identity Directory Serviceの物理的なアイデンティティ・ストア構成
必要に応じて使用できるように、アイデンティティ・ディレクトリについて構成項目の物理特性を把握し、文書化しておくことが重要です。
次の表に、物理的なアイデンティティ・ストア構成のプロパティを示します。
| 名前 | 説明 |
|---|---|
|
|
アイデンティティ・ストアのホストおよびポートの情報です。フェイルオーバー用に代替ホストおよびポートの詳細を設定することもできます。 |
|
|
ディレクトリのタイプです。有効な値は、 |
|
|
ディレクトリに接続するための資格証明です。 |
親トピック: アイデンティティ・ディレクトリAPIの構成
2.2.3 Identity Directory Serviceのオペレーション構成
Identity Directory Serviceの構成項目に関連する機能上および操作上の観点を調べ、特定する必要があります。
オペレーション構成には、主に、各エンティティのbase、name attributeおよびobjectclassの構成が含まれます。
次の表に、オペレーション構成のエンティティを示します。
| 名前 | 説明 |
|---|---|
|
|
エンティティを検索する必要のあるコンテナです。 |
|
|
新しいエンティティが作成されるコンテナです。 |
|
|
エンティティのRDN属性です。 |
|
|
このエンティティの検索時に使用される |
|
|
この新しいエンティティの作成時に追加される |
親トピック: アイデンティティ・ディレクトリAPIの構成
2.3 アイデンティティ・ディレクトリAPIの設計に関する推奨事項
アイデンティティ・ディレクトリAPIを作成する際に、年頭に置いておくべき重要な設計上のガイドラインがあります。
次の各トピックで、推奨事項について説明します。
- defaultFetch属性の使用を最小限に抑える
新しいアイデンティティ・ディレクトリを構成するときは、エンティティ属性の数をできるかぎり少なくする必要があります。 - アイデンティティ・ディレクトリの初期化を1回にする
アイデンティティ・ディレクトリの初期化では、ArisIdスタック全体の初期化にかなりの負荷がかかります。したがって、アイデンティティ・ディレクトリは1回のみ初期化する必要があります。
親トピック: アイデンティティ・ディレクトリAPIの使用
2.3.1 defaultFetch属性の使用を最小限に抑える
新しいアイデンティティ・ディレクトリを構成するときは、エンティティ属性の数をできるかぎり少なくする必要があります。
エンティティ属性はdefaultFetchの値によって定義されます。また、jpegphotoのように値が大きい属性は、defaultFetchの値をfalseで構成します。これは、エンティティをバックエンドから読み取るたびに、すべてのdefaultFetch属性がバックエンド・ディレクトリから取得されるためです。defaultFetch属性が多すぎるとパフォーマンスに影響を与えます。
2.4 アイデンティティ・ディレクトリAPIの使用例
アイデンティティ・ディレクトリAPIに関連する各種の操作を実行するには、次のサンプル・コードを使用します。
次の各トピックで、アイデンティティ・ディレクトリAPIに関連する操作について説明します。
- アイデンティティ・ディレクトリ・ハンドルの初期化と取得
Identity Directory Serviceの機能を使用するには、まず初期化関数を呼び出す必要があります。アイデンティティ・ディレクトリ・ハンドルが取得され、それを利用して基本的なユーザーとグループのCRUD操作が実行されます。 - JPSコンテキストからのアイデンティティ・ディレクトリ・ハンドルの初期化と取得
JPSコンテキストから、アイデンティティ・ディレクトリ・ハンドルを初期化して取得できます。サンプル・コードを使用してタスクを実行します。 - メモリー内アイデンティティ・ディレクトリ・ハンドルの初期化と取得
インメモリーのアイデンティティ・ディレクトリ・ハンドルを初期化して取得できます。サンプル・コードを使用してこのタスクを実行します。 - ユーザーの追加
アイデンティティ・ディレクトリ・ハンドルを取得すると、ユーザーとグループに対してCRUD操作を実行できます。サンプル・コードを使用して、ユーザーをアイデンティティ・ストアに追加します。 - 指定されたプリンシパルのユーザーの取得
指定されたプリンシパルのユーザーを取得できます。サンプル・コードを使用してタスクを実行します。 - ユーザーの変更
ユーザーを作成すると、ユーザーの既存の属性を変更することも、ユーザーを変更して属性を追加することもできます。サンプル・コードを使用してこのタスクを実行します。 - 指定されたID値のユーザーの取得
ユーザー詳細は、ユーザーのアイデンティティ値に基づいて取得できます。そのためには、取得問合せを作成して詳細をフェッチする必要があります。サンプル・コードを使用してこのタスクを実行します。 - 複雑な検索フィルタを使用したユーザーの検索
ユーザー取得の問合せで、複雑なフィルタの作成が必要になる場合もあります。これは、指定した基準を照合し、ターゲット検索操作の結果を返します。サンプル・コードを使用してこのタスクを実行します。 - ユーザー・パスワードの変更
ユーザーの作成後、ユーザーの属性を変更できます。サンプル・コードを使用して、ユーザーのパスワードを変更します。 - ユーザー・パスワードのリセット
アイデンティティ・ディレクトリに作成されたユーザーのパスワードをリセットできます。サンプル・コードを使用してこのタスクを実行します。 - ユーザーの認証
各種の操作を実行できる権限を付与する前に、ユーザーを認証する必要があります。APIを使用してユーザーを認証できます。 - ユーザーの削除
アイデンティティ・ディレクトリAPIを使用して、アイデンティティ・ストアに存在するユーザーを削除できます。サンプル・コードを使用してこのタスクを実行します。 - グループの作成
個々のユーザーに権限を付与するかわりに、ユーザーのグループ単位で権限を付与または拒否できるので、グループを作成すると便利です。アイデンティティ・ディレクトリにユーザー・グループを作成できます。 - グループの検索
検索フィルタを定義して、必要な基準に一致するグループを検索できます。 - 管理チェーンの取得
アイデンティティ・ディレクトリの任意のユーザーについて、管理階層を取得できます。サンプル・コードを使用してこのタスクを実行します。 - ユーザーのReporteeの取得
アイデンティティ・ディレクトリでターゲット検索フィルタを定義して、ユーザーのReporteeを取得できます。 - グループへのメンバーの追加
特定のグループに追加して、アイデンティティ・ディレクトリの既存のユーザーを論理的にグループ化できます。サンプル・コードを使用してこのタスクを実行します。 - グループからのメンバーの削除
アイデンティティ・ディレクトリAPIを使用して、あるグループのメンバーであるユーザーを隔離することができます。サンプル・コードを使用してこのタスクを実行します。 - ユーザーがメンバーとなっているすべてのグループの取得
アイデンティティ・ディレクトリAPIを使用すると、アイデンティティ・ディレクトリの既存のユーザーについて、そのユーザーが所属しているグループをすべて取得できます。サンプル・コードを使用してこのタスクを実行します。 - 検索フィルタでの論理NOT演算子の使用
アイデンティティ・ディレクトリでは、検索フィルタでNOT演算子を使用できます。検索フィルタにおけるNOT演算子は簡単に定義でき、その基準に一致する結果を取得できます。
親トピック: アイデンティティ・ディレクトリAPIの使用
2.4.1 アイデンティティ・ディレクトリ・ハンドルの初期化と取得
Identity Directory Serviceの機能を使用するには、まず初期化関数を呼び出す必要があります。アイデンティティ・ディレクトリ・ハンドルが取得され、それを利用して基本的なユーザーとグループのCRUD操作が実行されます。
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=example,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=example,dc=com");
opConfig.setEntityProperty("User", opConfig.CREATE_BASE,
"dc=us,dc=example,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=example,dc=com");
opConfig.setEntityProperty("Group", opConfig.CREATE
_BASE, "cn=groups,dc=us,dc=example,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();
}
}注意:
認証プロバイダとしてTivoliを使用する場合は、認証プロバイダのタイプとしてOPEN_LDAPを選択する必要があります。これは、Oracle WebLogic ServerでTivoliがサポートされていないためです。
Tivoliのディレクトリ・ハンドルを取得するようにIdentity Governance FrameworkまたはIdentity Directory Serviceを初期化すると、生成されたadapters.os_xmlファイルに次のパラメータが含まれています。
<param name="mapAttribute" value="orclGUID=entryUUID"/>
このTivoliのシナリオでは、次のようにorclGUID属性をibm-entryUUIDにマップする必要があります。
<param name="mapAttribute" value="orclGUID=ibm-entryUUID"/>
これらの変更を反映するため、adapters.os_xmlファイルを手動で更新する必要があります。さらに、属性マッピングの更新を有効にするためにOracle WebLogic Serverを再起動する必要があります。
親トピック: アイデンティティ・ディレクトリAPIの使用例
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();
}
}
親トピック: アイデンティティ・ディレクトリAPIの使用例
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=example,dc=com");
opConfig.setEntityProperty(opConfig.USER_ENTITY, opConfig.CREATE_BASE,
"cn=users,dc=us,dc=example,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=example,dc=com");
opConfig.setEntityProperty(opConfig.GROUP_ENTITY, opConfig.CREATE_BASE,
"cn=groups,dc=us,dc=example,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();
}
}
親トピック: アイデンティティ・ディレクトリAPIの使用例
2.4.4 ユーザーの追加
アイデンティティ・ディレクトリ・ハンドルを取得すると、ユーザーとグループに対してCRUD操作を実行できます。サンプル・コードを使用して、ユーザーをアイデンティティ・ストアに追加します。
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@example.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();
}
親トピック: アイデンティティ・ディレクトリAPIの使用例
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();
}
親トピック: アイデンティティ・ディレクトリAPIの使用例
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();
}
親トピック: アイデンティティ・ディレクトリAPIの使用例
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();
}
親トピック: アイデンティティ・ディレクトリAPIの使用例
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();
}
親トピック: アイデンティティ・ディレクトリAPIの使用例
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();
}
親トピック: アイデンティティ・ディレクトリAPIの使用例
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();
}
親トピック: アイデンティティ・ディレクトリAPIの使用例
2.4.11 ユーザーの認証
各種の操作を実行できる権限を付与する前に、ユーザーを認証する必要があります。APIを使用してユーザーを認証できます。
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();
}
親トピック: アイデンティティ・ディレクトリAPIの使用例
2.4.12 ユーザーの削除
アイデンティティ・ディレクトリAPIを使用して、アイデンティティ・ストアに存在するユーザーを削除できます。サンプル・コードを使用してこのタスクを実行します。
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();
}
親トピック: アイデンティティ・ディレクトリAPIの使用例
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();
}
親トピック: アイデンティティ・ディレクトリAPIの使用例
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();
}
親トピック: アイデンティティ・ディレクトリAPIの使用例
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();
}
親トピック: アイデンティティ・ディレクトリAPIの使用例
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();
}
親トピック: アイデンティティ・ディレクトリAPIの使用例
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();
}
親トピック: アイデンティティ・ディレクトリAPIの使用例
2.4.18 グループからのメンバーの削除
アイデンティティ・ディレクトリAPIを使用して、あるグループのメンバーであるユーザーを隔離することができます。サンプル・コードを使用してこのタスクを実行します。
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();
}
注意:
Identity Governance Framework/Identity Directory Serviceのグループ・メンバーシップ検索では、静的グループと動的グループの両方を評価します。ただし、メンバーシップの更新(追加/削除)は、動的グループではサポートされません。たとえば、グループからメンバーを削除する際に、そのメンバーがそのグループの動的メンバーである場合、動的グループでは削除操作がサポートされません。
親トピック: アイデンティティ・ディレクトリAPIの使用例
2.4.19 ユーザーがメンバーとなっているすべてのグループの取得
アイデンティティ・ディレクトリAPIを使用すると、アイデンティティ・ディレクトリの既存のユーザーについて、そのユーザーが所属しているグループをすべて取得できます。サンプル・コードを使用してこのタスクを実行します。
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();
}
親トピック: アイデンティティ・ディレクトリAPIの使用例
2.4.20 検索フィルタでの論理NOT演算子の使用
アイデンティティ・ディレクトリでは、検索フィルタでNOT演算子を使用できます。検索フィルタにおけるNOT演算子は簡単に定義でき、その基準に一致する結果を取得できます。
try {
SearchFilter f1 = new SearchFilter("firstname", SearchFilter.Operator.BEGINS_WITH, "demo");
SearchFilter f2 = new SearchFilter("orgunit", SearchFilter.Operator.CONTAINS, "myorg");
f2.negate();
SearchFilter filter = new SearchFilter(SearchFilter.LogicalOp.AND, f1, f2);
ResultSet<User> sr = uMgr.searchUsers(filter, searchOpts);
}
親トピック: アイデンティティ・ディレクトリAPIの使用例

