ヘッダーをスキップ
Oracle Fusion Middlewareセキュリティ・ガイド
11gリリース1(11.1.1)
B56235-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

19 ユーザーおよびロールAPIを使用した開発

この章では、ユーザーおよびロール管理のAPIの使用方法を説明します。この情報を利用する前に、これらのAPIが使用されているコンテキストに精通しておくことを強くお薦めします。詳細は、次の章または項を参照してください。

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

19.1 ユーザーおよびロールAPIフレームワークの概要

ユーザーおよびロールAPIフレームワークを使用すると、アプリケーションは、基礎となるアイデンティティ・リポジトリの種類を問わず、統一的で移植可能な方法でアイデンティティ情報(ユーザーとロール)にアクセスすることができます。リポジトリには、Oracle Internet Directory、Active Directory(Microsoft社)、Sun Java System Directory Server(Sun社)などのLDAPディレクトリ・サーバーや、データベース、フラット・ファイル、およびその他のカスタム・リポジトリを使用できます。

このAPIフレームワークには、移植可能な方法でプログラム的にリポジトリにアクセスするための便利な方法が用意されているため、アプリケーション開発者は、個々のアイデンティティ・ソースに対応した複雑な処理を考慮するという煩雑な作業から解放されます。このフレームワークにより、アプリケーションは異なるリポジトリをシームレスに操作できるようになります。アプリケーションは、コードを変更しなくても、各種のアイデンティティ・リポジトリを切り替えて使用することができます。

サポートされる操作には、ユーザーとロールの作成、更新、削除のほか、ユーザーおよびロールの属性や特定の情報の検索などがあります。たとえば、特定のロールのすべてのユーザーの電子メール・アドレスを検索できます。


注意:

これらのAPIは、認証機能または認可機能を対象としたものではなく、アイデンティティ情報の保持を目的としています。

基本使用モデル(コンテナ統合を使用しない)またはコンテナ統合を使用するモデル(コードの移植が可能)を使用できます。

アプリケーションがOracle WebLogic Serverコンテナのコンテキストの実行を目的としている場合は、weblogic.security.principal.WLSUserImplにプリンシパル・クラスをキャストする必要があります。

19.1.1 ユーザーおよびロールAPIとOracle WebLogic Serverの認証プロバイダ

ユーザーおよびロールAPIは、最初のOracle WebLogic Server認証プロバイダを使用するように自動的に構成されるため、特別な構成は必要ありません。

ただし、ユーザーおよびロールAPIがその他の認証プロバイダを使用する場合は構成が必要です。

APIは、Oracle WebLogic Serverドメインにリストされている最初のLDAP認証プロバイダからのみデータにアクセスできます。リスト上で最初の認証プロバイダの下位にあるLDAP認証プロバイダにはアクセスしません。

19.2 ロールとクラスの要約

表19-1は、ユーザーおよびロールAPIのクラスとインタフェースを示しています。

表19-1 ユーザーおよびロールAPIのクラスとインタフェース

名前 タイプ 説明

AuthenticationException

クラス

アイデンティティ・ストアへのアクセス中に認証エラーが発生すると、この例外がスローされます。認証エラーは、ユーザー・プログラムで指定された資格証明が無効な場合や、該当アイデンティティ・ストアでユーザーを認証できなかったときなどに発生する場合があります。

AuthenticationWarningException

クラス

このクラスは、IMException(次の説明を参照)を拡張したものです。

ComplexSearchFilter

インタフェース

複合検索フィルタは、基礎となるアイデンティティ・リポジトリから得られる結果のフィルタ処理に使用できる、複合的な論理式を表します。複合検索フィルタは、複数のSearchFilterインスタンスを1つの論理演算子(ANDまたはOR)で組合したものです。コンポーネントとなる各SearchFilter自体を複合フィルタにできるため、きわめて複雑なネストした検索フィルタの作成が可能です。

複合検索フィルタの作成例については、Javadoc(第19.9項「ユーザーおよびロールAPIリファレンス」)を参照してください。

ConfigurationException

クラス

この例外は、構成に問題がある場合にスローされます。この例外は、サービス・プロバイダへのアクセスに必要な構成情報が不正であるか、見つからないときに発生する場合があります。

Identity

インタフェース

このインタフェースは、アイデンティティ・リポジトリ内の基本的なアイデンティティを表します。

IdentityStore

インタフェース

IdentityStoreは、実際のアイデンティティ・リポジトリへのハンドルを表します。このハンドルを使用して、リポジトリ内のアイデンティティを検索、作成、削除または変更することができます。

IdentityStoreFactory

インタフェース

IdentityStoreFactoryは、基礎となるアイデンティティ・リポジトリをプログラム的に表したものです。アイデンティティ・リポジトリへの実際のハンドルは、このオブジェクトのgetIdentityStoreInstance(Hashtable)をコールすることによって取得できます。

IdentityStoreFactoryBuilder

クラス

このクラスは、アイデンティティ・ストア・ファクトリを構築します。

IMException

クラス

この例外は、ADFのアイデンティティ管理APIによってスローされるすべての例外のスーパー・クラスです。サブクラスの名前が障害の性質を示します。

既知の直接サブクラスのリストについては、Javadoc(第19.9項「ユーザーおよびロールAPIリファレンス」)を参照してください。

ModProperty

クラス

このクラスは、プロパティ・オブジェクトの変更を表します。ModPropertyは、プロパティ名、変更後の値(複数指定可能)および変更のタイプとともにコールされます。変更のタイプは、ADDREMOVEREPLACEのいずれかです。

NoPermissionException

クラス

この例外は、APIコール元がパーミッションを持たない操作を実行しようとしたときにスローされます。アクセス制御とパーミッションのモデルは、基礎となるアイデンティティ・ストアによって規定されます。

ObjectExistsException

クラス

この例外は、指定された名前のアイデンティティがすでに基礎となるアイデンティティ・ストアに存在している場合にスローされます。たとえば、この例外は、ユーザー作成APIコールが既存のユーザーの名前でユーザーを作成しようとするときにスローされます。

ObjectNotFoundException

クラス

この例外は、指定されたアイデンティティがアイデンティティ・ストアに存在しない場合にスローされます。

OperationFailureException

クラス

この例外は、基礎となるアイデンティティ・ストアでの実行中に操作が失敗した場合にスローされます。

OperationNotSupportedException

クラス

この例外は、サービス・プロバイダが特定の操作をサポートしていない場合に、サービス・プロバイダによってスローされます。たとえば、この例外は、サービス・プロバイダがUserManagerをサポートしていない場合に、IdentityStore.getUserManager()をコールすると、サービス・プロバイダによってスローされます。

PasswordPolicyException

クラス

このクラスは、IMException(前述の説明を参照)を拡張したものです。

プロパティ

クラス

Propertyには名前/値の情報が含まれます。

PropertySet

クラス

プロパティの名前/値ペアのコレクション。プロパティの名前/値ペアの表現にはPropertyクラスが使用されます。PropertySetでは、同じ名前のプロパティが重複しないことが保証されます。

Role

インタフェース

このインタフェースは、アイデンティティ・ストア内のロールを表します。

RoleManager

インタフェース

このインタフェースは、アイデンティティ・リポジトリ内でロールに関係する様々な操作の実行を管理するロール・マネージャを表します。

RoleProfile

インタフェース

このインタフェースは、ロールの詳細なプロファイルを表します。

SearchFilter

インタフェース

このインタフェースは、アイデンティティ・リポジトリの検索に使用される検索フィルタを表します。

SearchParameters

クラス

このクラスは、アイデンティティ・ストアの検索を実行するときに指定する必要のある検索パラメータを表します。このような検索パラメータには、次のものがあります。

検索フィルタ、検索するアイデンティティ・タイプ、ページ・サイズ、時間制限、件数制限。

SearchResponse

インタフェース

このインタフェースは、アイデンティティ・ストアの検索後に取得された検索結果を表します。実装は、サービス・プロバイダごとに固有です。

SimpleSearchFilter

インタフェース

このインタフェースは、アイデンティティ・リポジトリを検索するときに使用される簡易検索フィルタを表します。各簡易検索フィルタは、検索の属性またはプロパティ、評価演算子および値で構成される論理式です。この論理式が検索時に基礎となるアイデンティティ・リポジトリに適用され、一致した結果がフィルタ処理されて除外されます。

簡易検索フィルタの例については、Javadoc(第19.9項「ユーザーおよびロールAPIリファレンス」)を参照してください。

StoreConfiguration

インタフェース

StoreConfigurationは、特定のIdentityStoreインスタンスの構成プロパティを保持します。この構成オブジェクトのプロパティを変更することにより、該当するIdentityStoreインスタンスの動作を制御することができます。実際の構成プロパティとその値は、サービス・プロバイダに固有です。構成プロパティをまったくサポートしないサービス・プロバイダもあります。

SubjectParser

インタフェース

このインタフェースは、特定のサブジェクトからユーザーとロールのプリンシパルを抽出するユーティリティ・メソッドを提供します。このインタフェースの実装は、サービス・プロバイダが提供する必要があります。

User

インタフェース

このインタフェースは、アイデンティティ・ストア内のユーザーを表します。

UserManager

インタフェース

このインタフェースは、アイデンティティ・リポジトリ内でユーザーに関係する様々な操作の実行を管理する、ユーザー・マネージャを表します。

UserProfile

インタフェース

このインタフェースは、ユーザーの詳細なプロファイルを表します。このインタフェースを使用すると、汎用的な方法でユーザー・プロパティにアクセスすることができます。

次のAPIを使用して、ユーザーの任意のプロパティの読取りや変更を実行できます。

  • getProperty(java.lang.String)

  • getProperties(java.lang.String[])

  • setProperty(oracle.security.idm.ModProperty)

  • setProperties(oracle.security.idm.ModProperty[])


19.3 サービス・プロバイダの操作

この項では、プロバイダの基本的な概念とライフサイクルについて説明し、プロバイダを設定、構成および使用してOracle Platform Security環境でユーザー・リポジトリを操作する方法を説明します。

環境が正しく設定されていることを確認した後で、プロバイダを実装する際には、次の作業が必要になります。

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

19.3.1 サービス・プロバイダについて

ユーザーおよびロールAPIは、ユーザーとロールを管理するためにコールされますが、このAPIは基礎となるアイデンティティ・リポジトリと直接相互作用することはありません。セキュリティ・アプリケーションでは、かわりに、基礎となるリポジトリと実際の通信を実行するプロバイダが使用されます。このしくみでは、プロバイダと接続の情報を変更するだけで基礎となる様々なリポジトリに同じコードを使用できるため、柔軟性が得られます。

19.3.2 環境の設定

環境には、次のようないくつかのjarファイルが必要です。

  • provider jarファイル。目的の基礎となるアイデンティティ・リポジトリを実装します。

  • ユーザーおよびロールAPIのjarファイル

  • プロバイダで必要とされる可能性のある、その他のコンポーネントのjarファイル(Toplink、jdbc、xdbなど)。

関連するjarファイルがアプリケーションのクラスパスに含まれていることを確認してください。

19.3.3 プロバイダの選択

Oracle Platform Securityは、次のLDAPディレクトリをはじめとする一連のユーザー・リポジトリをサポートします。

  • Microsoft Active Directory

  • Novell EDirectory

  • Sun Java System Directory Server Enterprise Edition

  • Oracle Internet Directory

  • Oracle Virtual Directory

  • OpenLDAP

  • Oracle WebLogic Server対応のLDAPディレクトリ

プロバイダに使用するプロバイダ・クラスは、選択したアイデンティティ・ストアによって規定されます。プロバイダ・クラスは、ユーザーおよびロールAPIフレームワークで指定されたインタフェースを実装する必要があります。表19-2は、使用可能なプロバイダ・クラスを示しています。

表19-2 LDAPアイデンティティ・プロバイダ・クラス

プロバイダ ファクトリ名

Microsoft Active Directory

oracle.security.idm.providers.ad.ADIdentityStoreFactory

Novell EDirectory

oracle.security.idm.providers.edir.EDIdentityStoreFactory

Sun Java System Directory Server

oracle.security.idm.providers.iplanet.IPIdentityStoreFactory

Oracle Internet Directory


oracle.security.idm.providers.oid.OIDIdentityStoreFactory

Oracle Virtual Directory


oracle.security.idm.providers.ovd.OVDIdentityStoreFactory

OpenLDAP

oracle.security.idm.providers.openldap.OLdapIdentityStoreFactory

Oracle WebLogic Server対応のLDAPディレクトリ

oracle.security.idm.providers.wlsldap.WLSLDAPIdentityStoreFactory


19.3.4 プロバイダ・インスタンスの作成

プロバイダのクラス名を特定したら、次の手順を実行してプロバイダを作成します。

  1. IdentityStoreFactoryBuilderクラスのgetIdentityStoreFactoryメソッドを使用して、ファクトリ・インスタンスを構築します。このビルダー・クラスAPIは、次の情報を受け取ります。

    • プロバイダのクラス名

    • 必要な環境プロパティ(ハッシュ表から得られる)

  2. IdentityStoreFactoryクラスのgetIdentityStoreInstanceメソッドを使用して、ストア・インスタンスを作成します。

次の例では、Oracle Internet Directoryストアのファクトリ・インスタンスを作成しています。

IdentityStoreFactoryBuilder builder = new
   IdentityStoreFactoryBuilder ();

IdentityStoreFactory oidFactory = builder.getIdentityStoreFactory(
   “oracle.security.idm.providers.oid.OIDIdentityStoreFactory", factEnv);

これで、次のようにしてストアへの参照(アイデンティティ・ストアへの実際のハンドル)を取得できます。

oidStore = oidFactory.getIdentityStoreInstance(storeEnv);

この例では、次の2つのハッシュ表オブジェクトが指定されています。

  • factEnvハッシュ表は、ファクトリ・インスタンス環境を指定します。

  • storeEnvハッシュ表は、ストア・インスタンス環境を指定します。

19.3.5 プロバイダの構成プロパティ

構成は、使用するユーザーおよびロール・プロバイダに依存します。

すべてのタイプのLDAPベースのアイデンティティ・ストア・プロバイダの動作は、ファクトリ・インスタンスやストア・インスタンスの多数のプロパティを構成することにより、微調整することができます。次のプロパティは、LDAPベースのプロバイダにのみ関連しています。

  • URL

  • リポジトリが実行されるポート

  • リポジトリにアクセスするときに使用するユーザーとパスワード

LDAPベースのプロバイダのリストは、第19.3.3項「プロバイダの選択」を参照してください。

19.3.5.1 起動時と実行時の構成

構成可能なプロパティは、次の2つのカテゴリに分類されます。

  • 起動時の構成: 命名規則として、ST_で始まるプロパティ名が使用されます。

  • 実行時の構成: 命名規則として、RT_で始まるプロパティ名が使用されます。

起動時の構成プロパティ

起動時の構成は一回のみ実行され、いったん設定されると、構成の設定はプロバイダのライフタイムにわたって永続します。

ST_SUBSCRIBER_NAMEを除いて、起動時のプロパティはプロバイダのファクトリ・インスタンスの作成時に指定されます。ST_SUBSCRIBER_NAMEは、ストア・インスタンスの作成時に設定されます。

表19-3は、起動時の構成プロパティを示しています。

表19-3 起動時のアイデンティティ・プロバイダ構成プロパティ

プロパティ名 説明

ST_BINARY_ATTRIBUTES

基礎となるLDAPサーバーに格納されたバイナリ・オブジェクトの名前を含むStringオブジェクトの配列の配列。プロバイダは、LDAPサーバーとの間でデータを送受信するときに、これらの属性をバイナリとして扱います。

ST_CONNECTION_POOL

oracle.idm.connection.ConnectionPoolクラスのインスタンスである、外部接続プール。設定されている場合、プロバイダはこのプールを使用してLDAPサーバーへの接続を獲得し、ST_SECURITY_PRINCIPAL、ST_SECURITY_CREDENTIALS、ST_LDAP_URLの各プロパティは無視されます。

ST_USER_NAME_ATTR

アイデンティティ・リポジトリ内のユーザーのユーザー名の決定に使用される属性。

ST_GROUP_NAME_ATTR

アイデンティティ・リポジトリ内のロール名の決定に使用される属性。

ST_USER_LOGIN_ATTR

アイデンティティ・リポジトリ内のユーザーのログインIDの決定に使用される属性。

ST_SECURITY_PRINCIPAL

ユーザー(プリンシパル)。

ST_SECURITY_CREDENTIALS

アイデンティティ・リポジトリへのログインに必要な資格証明。

ST_LDAP_URL

アイデンティティ・リポジトリのURL。

ST_MAX_SEARCHFILTER_LENGTH

LDAPサーバーによって許可されている検索フィルタの最大長。

ST_LOGGER

APIによって使用されるログ出力オブジェクト。

ST_SUBSCRIBER_NAME

LDAPサーバーにおける操作の基本DN。このプロパティは、IdentityStoreインスタンスの作成時に指定され、残りのプロパティのデフォルト値を決定するために使用されます。このプロパティはIdentityStoreインスタンスの作成時に指定する必要がありますが、その後この値を変更しても、IdentityStoreの動作は影響を受けません。

ST_CONNECTION_POOL_CLASS

接続プールの完全修飾された実装クラス名。

ST_INITIAL_CONTEXT_FACTORY

初期コンテキストを作成する初期コンテキスト・ファクトリの完全修飾クラス名。


実行時の構成プロパティ

実行時に設定するプロパティは、プロバイダによって実行されるその後のすべての操作に影響し、そのプロバイダのIdentityStoreインスタンスの動作を制御します。

実行時のプロパティは、IdentityStoreインスタンスから取得されるStoreConfigurationオブジェクトで該当するパラメータと値を指定して構成します。すべての実行時プロパティには、IdentityStoreインスタンスの作成時にデフォルト値が設定されますが、これは後から変更することができます。

表19-3は、実行時の構成プロパティを示しています。

表19-4 実行時のアイデンティティ・プロバイダ構成プロパティ

プロパティ名 説明

RT_USER_OBJECT_CLASSES

LDAPサーバーでユーザーを作成するために必要なオブジェクト・クラスの配列。

RT_USER_MANDATORY_ATTRS

ユーザーの作成時に指定する必要のある属性名。

RT_USER_CREATE_BASES

新しいユーザーの作成が可能なLDAPサーバーでのベースDN。

RT_USER_SEARCH_BASES


RT_USER_SEARCH_BASES

ユーザーの検索が可能なLDAPサーバーでのベースDN。

RT_USER_FILTER_OBJECT_CLASSES

LDAPサーバーでユーザーを検索するときに使用するオブジェクト・クラスの配列。

RT_GROUP_OBJECT_CLASSES

LDAPサーバーにロールを作成するために必要なオブジェクト・クラスの配列。

RT_GROUP_MANDATORY_ATTRS

ロールの作成時に指定する必要のある属性名。

RT_GROUP_CREATE_BASES

新しいロールの作成が可能なLDAPサーバーでのベースDN。

RT_GROUP_SEARCH_BASES

ロールの検索が可能なLDAPサーバーでのベースDN。

RT_GROUP_MEMBER_ATTRS

ロールのメンバー属性の配列。ロールのすべてのメンバーは、この属性に関して値を持ちます。

RT_GROUP_FILTER_OBJECT_CLASSES

LDAPサーバーでロールを検索するときに使用するオブジェクト・クラスの配列。

RT_USER_SELECTED_CREATE_BASE

現在選択されているユーザー作成ベース。createUser()コールの実行時に、ユーザーはこのベースDNで作成されます。選択された作成ベースがNULLで、ST_SUBSCRIBER_NAMEが指定されていない場合は、最初に指定されたRT_USER_CREATE_BASEの値が使用されます。ST_SUBSCRIBER_NAMEを指定した場合は、アイデンティティ・ストアのタイプに基づくサブスクライバ名を基準とする相対値がデフォルト値になります。

RT_GROUP_SELECTED_CREATE_BASE

現在選択されているロール作成ベース。createRole()コールの実行時に、ロールはこのベースDNで作成されます。選択された作成ベースがNULLで、ST_SUBSCRIBER_NAMEが指定されていない場合は、最初に指定されたRT_GROUP_CREATE_BASEの値が使用されます。ST_SUBSCRIBER_NAMEを指定した場合は、アイデンティティ・ストアのタイプに基づくサブスクライバ名を基準とする相対値がデフォルト値になります。

RT_GROUP_GENERIC_SEARCH_BASE

特定のアイデンティティに関連付けられたロールの検索に使用する一般的なロール検索ベース。たとえば、特定のユーザーに付与されたすべてのロールや、特定のユーザーのすべての管理対象ロールを検索する場合は、目的となるすべてのグループが存在する検索ベースが必要になります。これは、検索の最適化に役立ちます。通常、この検索ベースは共通の親です。すべてのLDAPプロバイダでは、この値はデフォルトでサブスクライバ名に設定されます(指定されている場合)。指定がない場合は、最初のグループ検索ベースが使用されます。

RT_SEARCH_TYPE

LDAPサーバーでの検索が、SIMPLE、PAGED、VIRTUAL_LIST_VIEWのどのタイプかを決定します。


19.3.5.2 構成の値を渡すタイミング

構成データは、次のタイミングで指定できます。

19.3.6 ファクトリ・インスタンス作成時のプロバイダの構成

この項では、ファクトリ・インスタンス作成時のプロバイダの構成に関連するトピックを説明します。

この段階での構成は、そのファクトリ・オブジェクト全体、および、その特定のファクトリ・インスタンスを使用して作成されるオブジェクトに影響を与えます。次の一般的なプロパティをはじめとして、多くの起動時のプロパティがこの時点で設定されます。

  • ST_LDAP_URL: LDAPリポジトリのURL

  • ST_SECURITY_PRINCIPAL: ユーザー名

  • ST_SECURITY_CREDENTIAL: リポジトリへの接続に必要なユーザー資格証明

19.3.6.1 Oracle Internet Directoryプロバイダ

次の例では、Oracle Internet Directory(OID)ファクトリの設定時にプロバイダが構成されています。

IdentityStoreFactoryBuilder builder = new
   IdentityStoreFactoryBuilder();
IdentityStoreFactory oidFactory = null;
Hashtable factEnv = new Hashtable();

// Creating the factory instance
factEnv.put(OIDIdentityStoreFactory.ST_SECURITY_PRINCIPAL,
   "<User DN>");
factEnv.put(OIDIdentityStoreFactory.ST_SECURITY_CREDENTIALS,
   "<User password>");
factEnv.put(OIDIdentityStoreFactory.ST_LDAP_URL,
   "ldap://ldaphost:port/");
oidFactory = builder.getIdentityStoreFactory(
   "oracle.security.idm.providers.oid.
   OIDIdentityStoreFactory", factEnv);

注意:

イタリックの値は実行前に適切な値に置換する必要があります。

19.3.6.2 既存のログ出力オブジェクトの使用

ユーザーおよびロールAPIに名前付きのログ出力オブジェクトを指定することができます。APIは指定されたログ出力を使用してメッセージを記録します。ファクトリの作成時に外部ログ出力名を環境変数として指定する必要があります。

例を次に示します。

Logger mylogr = Logger.getLogger("mylogger.abc.com");
FileHandler fh = new FileHandler("userroleapi.log");
mylogr.addHandler(fh);

…

factEnv.put(OIDIdentityStoreFactory.ST_LOGGER_NAME,
"mylogger.abc.com");
oidFactory = builder.getIdentityStoreFactory(
   "oracle.security.idm.providers.oid.
   OIDIdentityStoreFactory", factEnv);

このコードにより、すべてのログ・メッセージは、userroleapi.logという名前のログ・ファイルにリダイレクトされます。

19.3.6.3 定数値の指定

ファクトリの作成時にST_PROPERTY_ATTRIBUTE_MAPPINGプロパティにマップを指定することにより、定数を上書きしたり、欠落している定数に事前に値を指定することができます。

次のサンプル・コードでは、RoleProfile.OWNERから"myowner"属性へのマッピングを設定しています。このようにすると、getOwners()やgetOwnedRoles()など、所有者に関連するすべての操作がこの属性を使用して実行されます。

factEnv.put
   (IPIdentityStoreFactory.ST_SECURITY_PRINCIPAL, "<User DN>");
factEnv.put
   (IPIdentityStoreFactory.ST_SECURITY_CREDENTIALS, "<User password>");
factEnv.put(IPIdentityStoreFactory.ST_LDAP_URL,
   "ldap://ldaphost:port/");

Map m = new Hashtable();
m.put(RoleProfile.OWNER, "myowner");

factEnv.put
   (IPIdentityStoreFactory.ST_PROPERTY_ATTRIBUTE_MAPPING, m);

ipFactory = builder.getIdentityStoreFactory(
   "oracle.security.idm.providers.iplanet.IPIdentityStoreFactory",
   factEnv);

19.3.6.4 接続パラメータの構成

ST_CONNECTION_POOL_MIN_CONNECTIONSおよびST_CONNECTION_POOL_MAX_CONNECTIONSを使用して、接続プールの最大接続数と最小接続数のパラメータを構成することができます。デフォルトでは、これらのパラメータの値は、それぞれ0と10です。また、次の制約があります。

(ST_CONNECTION_POOL_MAX_CONNECTIONS  - ST_CONNECTION_POOL_MIN_CONNECTIONS) >= 10

例を次に示します。

factEnv.put
   (LDIdentityStoreFactory.ST_CONNECTION_POOL_MIN_CONNECTIONS,  "3");

factEnv.put
   (LDIdentityStoreFactory.ST_CONNECTION_POOL_MAX_CONNECTIONS, "16");

19.3.6.5 カスタム接続プール・クラスの構成

この項では、カスタム接続プール・クラスの指定方法について説明します。

カスタム接続プールを使用するには、次のように、カスタム接続プール・クラスの完全修飾クラス名を指定する必要があります。

factEnv.put(OIDIdentityStoreFactory.ST_CONNECTION_POOL_CLASS,
"oracle.security.idm.providers.stdldap.JNDIPool");

19.3.7 ストア・インスタンス作成時のプロバイダの構成

IdentityStoreの構成は、そのストア・オブジェクト、および、そのストア・インスタンスを使用して作成されるすべてのオブジェクトに影響を与えます。ストアで一般的に使用される構成パラメータは、この時点で受け入れられる唯一の起動時プロパティである、ST_SUBSCRIBER_NAMEです(すべての実行時プロパティはアイデンティティ・ストアの作成時に指定可能です)。

第19.3.6項「ファクトリ・インスタンス作成時のプロバイダの構成」で示したファクトリ・インスタンスの作成例の続きとして、次のコードではストアへのハンドル・インスタンスを作成しています。

IdentityStore oidStore = null;
Hashtable storeEnv = new Hashtable();

// Creating the store instance
storeEnv.put(OIDIdentityStoreFactory.ST_SUBSCRIBER_NAME,
   "dc=us,dc=oracle,dc=com");
oidStore = oidFactory.getIdentityStoreInstance(storeEnv);

注意:

ディレクトリでは、有効なサブスクライバ名が指定されている必要があります。

Oracle Internet Directoryの場合は、ST_SUBSCRIBER_NAMEを正しいDNまたはレルムのニックネームで指定することができます。


19.3.8 実行時の構成

前述の、第19.3.6項「ファクトリ・インスタンス作成時のプロバイダの構成」および第19.3.7項「ストア・インスタンス作成時のプロバイダの構成」では、インスタンスの作成時に構成を実行する方法を示しました。また、実行時のプロパティの追加と変更を容易にするために、ユーザーおよびロールAPIにはConfigurationクラスが用意されています。

Configurationインスタンスは、IdentityStore.getStoreConfiguration() APIコールを使用して、ストア・インスタンスから取得できます。この構成オブジェクトを使用してプロパティを変更することができます。

この方法で変更できるのは実行時のプロパティのみであり、変更が有効になるのは実行時のみです。

次の例では、RT_USER_SEARCH_BASESプロパティを設定します。

StoreConfiguration conf = oidStore.getStoreConfiguration();
conf.setProperty(“RT_USER_SEARCH_BASES”, “dc=us,dc=oracle,dc=com”);

19.3.9 プログラミングの考慮事項

この項では、プロバイダとプロバイダ・アーティファクトの操作のヒントを説明します。

19.3.9.1 プロバイダの移植性に関する考慮事項

プロバイダを切り替えるとき(FusionDBプロバイダからOracle Internet Directoryプロバイダ、またはその逆など)にアプリケーションの移植性を保証するため、ユーザーおよびロールAPIを操作するときには、次のガイドラインに従ってください。

  1. ユーザー・プロパティを参照するときには、対応するoracle.security.idm.UserProfile定数のみを使用します。アイデンティティ・リポジトリ間で移植不可能なネイティブの名前は使用しないでください。たとえば、アプリケーションでユーザーのログイン名を取得する必要がある場合は、次のようにUserProfile.USER_NAME定数を使用してフェッチします。

    Property prop = usrprofile.getProperty(UserProfile.USER_NAME);
    
  2. 理由は明らかですが、ほとんどの標準的なユーザー・プロパティにはUserProfile定数が用意されています。ただし、すべてのプロパティに用意されているとはかぎりません。アプリケーションで特定のユーザーのすべてのプロパティを汎用的に取得する必要がある場合は、次のコードを使用します。

    UserProfile upf = null;
    
    // Obtain the user profile from user object. User object can be obtained using search
    
    // get the properties supported for given user in currently configured repository
    List proplst = store.getUserPropertyNames();
    
    String[] proparr = (String[]) proplst.toArray(new String[proplst.size()]);
    
    // get all properties of the user
    PropertySet pset = upf.getProperties(proparr);
    
  3. 検索フィルタを作成するときには、検索フィルタの文字列内で直接ネイティブのワイルド・カード文字を使用しないでください。かわりに、SimpleSearchFilter.getWildCardCharacter() APIを使用します。これにより、基礎となるプロバイダに基づいて正しいワイルド・カード文字がフェッチされます。たとえば、このAPIは、FusionDBプロバイダの場合は%を返し、Oracle Internet Directory(OID)プロバイダの場合は*を返します。

    SmpleSearchFilter sf = m_identityStore.getSimpleSearchFilter(
       attrName, SimpleSearchFilter.TYPE_EQUAL, null);
    
    sf.setValue( filterStringWithoutWildcard+sf.getWildCardChar());
    
  4. アプリケーションが事前定義済のワイルド・カード文字を含むユーザー指定のフィルタ文字列を受け入れる場合は、ユーザーおよびロールAPIのフィルタを生成するときに、フィルタに次の変換を適用します。

    //User supplied filter which assumes “%” as the wildcard character
    
    String userDefinedFilter = .................
    
    SmpleSearchFilter sf = m_identityStore.getSimpleSearchFilter(
       attrName, SimpleSearchFilter.TYPE_EQUAL, null);
    
    userDefinedFilter =
       userDefinedFilter.replaceall("%", sf.getWildCardChar());
    
    sf.setValue(  userDefinedFilter);
    

    太字の行により、ユーザー指定のフィルタは汎用的なユーザーおよびロールAPIのフィルタ・フォーマットに変換されます。

19.3.9.2 IdentityStoreオブジェクト使用時の考慮事項

スレッド・セーフティ

現在のIdentityStoreの実装は、スレッドセーフではありません。ユーザーおよびロールAPIでは、ストア・インスタンスは通常はスレッド間で共有されないと想定されています。ストア・インスタンスがスレッド間で共有される場合は、スレッド・セーフティに要求されるすべての問題点にアプリケーション・コードで対処する必要があります。

スレッド・セーフティとパフォーマンスの間には、トレードオフが存在します。スレッド・セーフティを実装する必要のあるユースケースでは、実装によるパフォーマンスへの影響を考慮に入れる必要があります。

セッションごとに1つのストア・インスタンス

DASなどのアプリケーションでは、(対応するログイン・ユーザーごとに)各セッションで作成/検索ベースやその他の様々な実行時設定を変更することができます。これらはユーザーおよびロールAPIの実行時のプロパティとして定義されます。IdentityStoreオブジェクトは、このようなすべての設定をカプセル化し、これに応じて実行時の動作を変更します。このような理由から、セッションごとに1つのIdentityStoreインスタンスというルールが適用されています。

19.3.10 プロバイダのライフサイクル

プロバイダは、そのプロバイダ用に作成されたファクトリ・インスタンスが存続している間、存在し続けます。ファクトリ・インスタンスの寿命は、そのインスタンスに対してclose() APIがコールされると終了します。プロバイダ・インスタンスが終了すると、そのインスタンスを使用して作成されたすべてのオブジェクトは無効になり、そのようなオブジェクトに対するその後のAPIコールでは、予期しない結果が返されます。

IdentityStoreのインスタンスにも、同様の考慮事項が当てはまります。


注意:

  • ファクトリ・インスタンスはスレッドセーフですが、IdentityStoreインスタンスの場合はスレッドセーフではありません。

  • ベスト・プラクティスとしては、サーバー接続を一括して閉じ、使用されなくなったオブジェクトとインスタンスを明示的に削除することです。


19.4 リポジトリの検索

ユーザーおよびロールAPIには、次の2種類の問合せ関数があります。

この項では、これらのAPIを使用して実行可能な次の検索および関連タスクについて説明し、検索パラメータの指定方法を詳細に示します。

19.4.1 特定のアイデンティティの検索

searchUserおよびsearchRole APIを使用すると、アイデンティティ・ストアに対して次のように特定のユーザーまたはロールを直接問い合せることができます。

IdentityStore.searchUser(String name);

IdentityStore.searchUser(Principal principal);

IdentityStore.searchUser(int searchType, String name);

ここで、searchTypeには次のものを指定できます。

  • SEARCH_BY_NAME

  • SEARCH_BY_UNIQUE_NAME

IdentityStore.searchRole(int searchType, Sting value);

これらのAPIは、特定のユーザーまたはロールのアイデンティティが該当ストア内に存在することがわかっているときに、そのアイデンティティへのオブジェクト参照が必要な場合の単純な問合せに役立ちます。これらのAPIの機能は、次の点で最小限になっています。

  • 文字列値のみを受け取る。

  • 正規表現をサポートしない。

これらの関数では、ストア内に同じ値を持つ複数のエンティティが存在すると例外が発生します。

19.4.2 複数のアイデンティティの検索

ユーザーおよびロールAPIには、検索を実行して複数のアイデンティティを返すことのできる、次のようないくつかの関数が含まれています。

IdentityStore.search(SearchParams params);
IdentityStore.searchUsers(SearchParams params);
IdentityStore.searchRoles(int searchType, SearchParams params);
IdentityStore.searchProfiles(SearchParams params);

各関数は、検索オブジェクトを受け取り、検索レスポンス・オブジェクトを返します。

19.4.3 検索パラメータの指定

SearchParamsオブジェクト

SearchParamsオブジェクトには、次の情報が格納されます。

  • 検索フィルタ: 後で説明します。

  • 検索するアイデンティティ・タイプ: RolesまたはUsersアイデンティティ・タイプを検索できます。

  • ページ・サイズ: デフォルトでは、ページング・オプションは無効になっています。問合せでページングが必要な場合は、ページ・サイズを適切な正の値に設定してください。

  • タイムアウト制限: タイムアウトは秒単位で指定されます。

  • 件数制限: 問合せによって返される結果の数を制限します。

SearchResponseオブジェクト

SearchResponseは、複数のアイデンティティを取得するときに使用されるデータ構造体です。コードでは、次の関数を使用して、この構造体に格納された複数のアイデンティティを繰り返し処理できます。

  • hasNext(): さらに要素が存在する場合はtrueを返し、そうでない場合はfalseを返します。

  • next(): 次の要素が使用可能であればその要素を返し、そうでなければ例外を返します。

19.4.4 検索フィルタの使用方法

ユーザーおよびロールAPIには、様々な検索操作を容易に実行するための各種の検索フィルタが含まれています。この項では、検索フィルタの使用方法の重要なポイントについて説明します。

19.4.4.1 検索フィルタの演算子

検索フィルタの演算子を使用するときには、次のルールを順守してください。

サポートされる演算子

標準のLDAPストアは、=(等号演算子)、<(未満演算子)、>(超過演算子)、&(AND演算子)、|(OR演算子)および!(NOT演算子)のみを受け入れます。IdentityStoreでは、さらに2つの演算子<=(以下)および>=(以上)が用意されており、使用しやすくなっています。

演算子=、<、>、<=および>=は簡易検索フィルタの作成に使用され、演算子&および|は2つ以上の検索文字列の組合せによる複合検索フィルタの作成に使用されます。

NOT演算子

NOT演算子は、簡易検索フィルタと複合検索フィルタの両方で使用できます。この演算子は、フィルタの状態を否定する、つまりフィルタによって前に拒否されたエンティティを受け入れるように(またはその逆に)フィルタの状態を変更するために使用します。

NOT演算子には、次のSearchFilter APIを使用してアクセスできます。

  • void negate();

  • boolean isNegated();

19.4.4.2 検索フィルタ使用時の特殊文字の処理

RFC-2254(LDAP検索フィルタの文字列表現)に従って、*、(、)、\およびNULL文字は個別に処理する必要があります。ユーザーおよびロールAPIは、演算子(、)および\を処理しますが、LDAPストアのワイルドカード文字でもある*演算子は処理されません。これらの文字はユーザーおよびロールAPIフレームワークで処理されるため、APIユーザーはこれらの文字を別途に処理する必要はありません。

19.4.4.3 検索フィルタの使用例

ここでは、いくつかの使用例を示します。

例1: 名前によってユーザーを取得するための簡易フィルタ

簡易検索フィルタの実装は、基礎となるストアに依存します。検索フィルタのインスタンスはストア・インスタンスを使用して取得できます。

この例のフィルタでは、名前フィールドの値が非NULLであるすべてのエントリが許可されます。

SimpleSearchFilter sf =
   oidStore.getSimpleSearchFilter(UserProfile.NAME,
   SimpleSearchFilter.TYPE_EQUAL, null);
sf.setValue(sf.getWildCardChar());

例2: 言語プリファレンスによってユーザーを検索するための簡易フィルタ

この例では、優先言語が英語以外のユーザーが検索されます。

SimpleSearchFilter sf =
   oidStore.getSimpleSearchFilter(
      UserProfile.PREFERRED_LANGUAGE,
      SimpleSearchFilter.TYPE_EQUAL,
      "english");
sf.negate();

例3: 先頭の文字による名前の複合フィルタ

この複合フィルタは、複数の検索フィルタを演算子の&または|で結合しています。このフィルタでは、aからjまでの文字で始まる名前のユーザーが検索されます。

SimpleSearchFilter sf1 =
   oidStore.getSimpleSearchFilter(
      UserProfile.NAME,
      SimpleSearchFilter.TYPE_GREATER,
      null);

sf1.setValue("a"+sf1.getWildCardChar());
SimpleSearchFilter sf2 =
   oidStore.getSimpleSearchFilter(UserProfile.NAME,
      SimpleSearchFilter.TYPE_LESS, null);
sf2.setValue("j"+sf2.getWildCardChar());
SimpleSearchFilter sfArray[] = new SimpleSearchFilter[] {sf1, sf2};
ComplexSearchFilter cf1 =
store.getComplexSearchFilter(sfArray, ComplexSearchFilter.TYPE_AND);

例4: 先頭の文字を制限する複合フィルタ

この例では、複合フィルタのネストにより、文字のiで始まるものを除いて、aからjまでの文字で始まる名前を持つユーザーを検索することができます。

[continue from Example 3]

SimpleSearchFilter sf3 =
   oidStore.getSimpleSearchFilter(
      UserProfile.NAME,
      SimpleSearchFilter.TYPE_EQUAL,
      null);

sf3.setValue(“i”+sf3.getWildCardChar());
sf3.negate();

SearchFilter sfArray2[] = new SearchFilter[] {cf1, sf3};
ComplexSearchFilter cf2 =
   store.getComplexSearchFilter(sfArray2, ComplexSearchFilter.TYPE_AND);

例5: 出力付きの完全な検索

このコードは、文字のaで始まる名前をフィルタ処理し、戻り値を出力します。

// search filter (cn=a*)
SimpleSearchFilter sf = oidStore.getSimpleSearchFilter(
      UserProfile.NAME,
      SimpleSearchFilter.TYPE_EQUAL,
      null);
sf.setValue("a"+sf.getWildCardChar());

SearchParameters params = new SearchParameters();
params.setFilter(sf);

// Searching for users
SearchResponse resp = oidStore.searchUsers(params);
System.out.println("Searched users are:");
while (resp.hasNext()) {
   Identity idy = resp.next();
   System.out.println("Unique name: "+idy.getUniqueName());
}

19.4.5 GUIDによる検索

この例では、ユーザーおよびロールAPIで取得されたGUIDの値を直接検索に使用することができます。

// up = user.getUserProfile();
String guid = up.getGUID();
SimpleSearchFilter sf1 = oidStore.getSimpleSearchFilter(
   UserProfile.GUID,
   SimpleSearchFilter.TYPE_EQUAL, guid);
SearchParameters params = new SearchParameters();
params.setFilter(sf1);
SearchResponse resp = oidStore.search(params);
while (resp.hasNext())
   System.out.println("user for guid : " + guid + ","+ resp.next());

19.5 ユーザー認証

検証目的で、ユーザーおよびロールAPIをパスワードベースのユーザー認証に使用できます。

authenticateUser APIは、ユーザー・ログイン名を受け取り、指定されたパスワードを使用してユーザーの認証を試みます。認証が成功した場合は、ユーザー・オブジェクトを返します。

パスワードベースの認証の例を次に示します。

store.getUserManager().authenticateUser(“testuser”,”password”);

19.6 アイデンティティ・ストアのエントリの作成と変更

ユーザーおよびロールAPIを使用すると、アイデンティティ・ストアへの新規アイデンティティの追加やストアでのアイデンティティの変更が容易になります。UserManagerクラスとRoleManagerクラスは、それぞれ、ユーザーとロールに固有のデータの作成、変更および削除操作を処理します。

UserManagerとRoleManagerのインスタンスは、ストア・インスタンスから次のようにして取得できます。

UserManager um = oidStore.getUserManager();
RoleManager rm = oidStore.getRoleManager();

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

19.6.1 アイデンティティ作成時の特殊文字の処理

RFC-2253によって、LDAP v3の識別名の文字列表現が定義されます。つまり、RFCで指定されたすべての文字が処理されます。ユーザーおよびロールAPIのユーザーは、これらの特殊文字をエスケープ/エスケープ解除する必要はありません。特殊文字をエスケープ/エスケープ解除すると、間違った結果になります。

これによって、空のプロパティを使用してアイデンティティを作成するときに問題が生じる可能性があります。この場合、RDN名を使用して様々な必須属性の値が指定されます。これらの必須属性の中には、より厳格な検証ルールが適用されるものもあります。その場合は、アイデンティティの作成が失敗して、例外が発行されます。

19.6.2 アイデンティティの作成

UserManagerクラスの次の2つのAPIを使用すると、ユーザーを容易に作成できます。

  • createUser(java.lang.String name, char[] password)
    

    指定された名前とパスワードを持つユーザーを、基礎となるリポジトリに作成します。

    アイデンティティ・ストアで一部の属性が必須として指定されている場合は、そのようなすべてのフィールドにnameの値が移入されます。

  • createUser(java.lang.String name, char[] password, PropertySet suppliedProps)
    

    プロパティは、指定されたプロパティ値を使用して設定されます。必須の属性値が指定されていない場合は、欠落した属性にデフォルトとしてnameの値が使用されます。

同様に、RoleManagerのAPIはロールの作成に使用されます。

ロールは次の2つのカテゴリに分類されます。

  • アプリケーション・スコープ

  • エンタープライズ・スコープ

RoleManagerを起動してロールを作成する場合、デフォルトでは、特に指定しないかぎり、ロールはエンタープライズ・スコープで作成されます。

ロールの作成をサポートするRoleManagerのAPIには、次のものがあります。

createRole(String roleName);
createRole(String roleName, int roleScope);

ロールの作成手順はユーザーの作成手順と類似しています。すべての必須の属性にはroleNameの値が指定されます。

19.6.3 アイデンティティの変更

アイデンティティを変更するには、そのアイデンティティへの参照が必要です。User、UserProfile、Role、RoleProfileの各クラスに、アイデンティティの変更を容易にするための次のようなAPIが用意されています。

user.setProperty(ModProperty prop);

user.setProperties(ModProperty [] props);

ModProperty構造体は、次のもので構成されます。

  • フィールド名

  • フィールドの新しい値(複数可)

  • 変更演算子

有効な演算子は次のとおりです。

ModProperty.ADD
ModProperty.REMOVE
ModProperty.REPLACE

次の例では、表示名が置換されます。

UserProfile usrprofile = usr.getUserProfile();

ModProperty mprop = new ModProperty(UserProfile.DISPLAY_NAME,
   "modified display name",
   ModProperty.REPLACE);

usrprofile.setProperty(mprop);

複数の値を持つ属性の中の特定の値を変更する場合は、最初にその値を削除し、次に新しい値を追加するという2段階の手順になります。

19.6.4 アイデンティティの削除

アイデンティティの削除には、dropUserdropRoleの各APIを使用します。

アイデンティティを削除する場合は、コードにユーザーとロールの両方の参照が必要になります。

例を次に示します。

User usr;
Role role;
…
…
usrmanager.dropUser(usr);
rolemanager.dropRole(role);

19.7 ユーザーおよびロールAPIの使用例

この項では、ユーザーおよびロールAPIの実際のアプリケーションを示した3つの例を取り上げます。

19.7.1 例1: ユーザーの検索

この例では、Oracle Internet Directoryのアイデンティティ・ストアで、ユーザーを検索するための簡易検索フィルタを設定しています。

import oracle.security.idm.*;
import oracle.security.idm.providers.oid.*;
import java.util.*;
import java.io.*;

public class SearchUsersOID
{
  public static void main(String args[])
  {
    IdentityStoreFactoryBuilder builder = new
IdentityStoreFactoryBuilder();
    IdentityStoreFactory oidFactory = null;
    IdentityStore oidStore = null;

    try
    {

      Hashtable factEnv = new Hashtable();
      Hashtable storeEnv = new Hashtable();

      // creating the factory instance
      factEnv.put(OIDIdentityStoreFactory.ST_SECURITY_PRINCIPAL,
                   "<User DN>");
      factEnv.put(OIDIdentityStoreFactory.ST_SECURITY_CREDENTIALS,
                   "<User password>");
      factEnv.put(OIDIdentityStoreFactory.ST_LDAP_URL,
                  "ldap://ldaphost:port/");
oidFactory =  builder.getIdentityStoreFactory(
              "oracle.security.idm.providers.oid.OIDIdentityStoreFactory",
              factEnv);

      // creating the store instance
         storeEnv.put(OIDIdentityStoreFactory.RT_SUBSCRIBER_NAME,
         "<Subscriber name>");
      oidStore = oidFactory.getIdentityStoreInstance(storeEnv);

      // search filter (cn=a*)
      SimpleSearchFilter sf = oidStore.getSimpleSearchFilter(
                    UserProfile.NAME, SimpleSearchFilter.TYPE_EQUAL, null);
      sf.setValue("a"+sf.getWildCardChar());
// sf2 search filter (!(cn=*a))
SimpleSearchFilter sf2 = oidStore.getSimpleSearchFilter(
                    UserProfile.NAME, SimpleSearchFilter.TYPE_EQUAL, null);
sf2.setValue(sf.getWildCardChar()+"a");
sf2.negate();

SimpleSearchFilter sfArray[] = new SimpleSearchFilter[] {sf,sf2};
ComplexSearchFilter cf1 = oidStore.getComplexSearchFilter(sfArray,
ComplexSearchFilter.TYPE_AND);

SearchParameters params = new SearchParameters();
params.setFilter(cf1);

 // Searching for users
SearchResponse resp = oidStore.searchUsers(params);
System.out.println("Searched users are:");
while (resp.hasNext()) {
    Identity idy = resp.next();
    System.out.println("Unique name: "+idy.getUniqueName());
}
    }catch (IMException e)
    {
      e.printStackTrace();
    }
  }
}

19.7.2 例2: Oracle Internet Directoryストアにおけるユーザー管理

この例では、Oracle Internet Directoryストアで、アイデンティティの作成、変更、削除を含む、次のようなユーザー管理タスクを実行しています。

  • ユーザーの作成

  • ユーザーの表示名の変更

  • ユーザーの削除

public class CreateModifyDeleteUser
{
  public static void main(String args[])
  {
    IdentityStoreFactoryBuilder builder = new
IdentityStoreFactoryBuilder();
    IdentityStoreFactory oidFactory = null;
    IdentityStore oidStore = null;

    try
    {

      Hashtable factEnv = new Hashtable();
      Hashtable storeEnv = new Hashtable();

      // creating the factory instance
      factEnv.put(OIDIdentityStoreFactory.ST_SECURITY_PRINCIPAL,
                   "<User DN>");
      factEnv.put(OIDIdentityStoreFactory.ST_SECURITY_CREDENTIALS,
                   "<User password>");
      factEnv.put(OIDIdentityStoreFactory.ST_LDAP_URL,
                  "ldap://ldaphost:port/");
      oidFactory =  builder.getIdentityStoreFactory(
                  "oracle.security.idm.providers.oid.
OIDIdentityStoreFactory",
               factEnv);

      // creating the store instance
      storeEnv.put(OIDIdentityStoreFactory.RT_SUBSCRIBER_NAME,
                   "dc=us,dc=oracle,dc=com");
      oidStore = oidFactory.getIdentityStoreInstance(storeEnv);

      //get UserManager
      UserManager usrmanager = oidStore.getUserManager();

      // create user
      String usrname = "testuser";
      // delete user if already exists
      try
      {
        User usr = oidStore.searchUser(usrname);
        usrmanager.dropUser(usr);
      }catch(IMException ime){}

      System.out.println("creating user "+usrname);
      User usr =
usrmanager.createUser(usrname,"passwd1".toCharArray());
      System.out.println("user (" +usr.getUniqueName() + ") created");

      // modifying user properties
      System.out.println("modifying property
UserProfile.DISPLAY_NAME");
      UserProfile usrprofile = usr.getUserProfile();
      ModProperty mprop = new ModProperty(
UserProfile.DISPLAY_NAME,
                        "modified display name",
                        ModProperty.REPLACE);

      usrprofile.setProperty(mprop);

      System.out.println("get property values
UserProfile.DISPLAY_NAME");
      Property prop = usrprofile.getProperty(UserProfile.DISPLAY_NAME);
      List values = prop.getValues();
      Iterator itr = values.iterator();
      while(itr.hasNext()) {
        System.out.println(UserProfile.DISPLAY_NAME+": "+ itr.next());
      }
      System.out.println();

      // drop user
      System.out.println("Now dropping user "+usrname);
      usrmanager.dropUser(usr);
      System.out.println("user dropped");

    }catch (IMException e)
    {
      e.printStackTrace();
    }
  }
}

19.7.3 例3: Microsoft Active Directoryストアにおけるユーザー管理

この例では、Microsoft Active Directoryストアで、アイデンティティの作成、変更、削除を含む、次のようなユーザー管理タスクを実行しています。

  • ユーザーの作成

  • ユーザーの表示名の変更

  • ユーザーの削除

package oracle.security.idm.samples;

import oracle.security.idm.*;
import oracle.security.idm.providers.ad.*;
import java.util.*;
import java.io.*;

public class CreateModifyDeleteUserAD
{
  public static void main(String args[])
  {
    IdentityStoreFactoryBuilder builder = new IdentityStoreFactoryBuilder();
    IdentityStoreFactory adFactory = null;
    IdentityStore adStore = null;

    try
    {

      Hashtable factEnv = new Hashtable();
      Hashtable storeEnv = new Hashtable();

      String keystore = "/home/bhusingh/client_keystore.jks";
      System.setProperty("javax.net.ssl.trustStore",keystore);
      System.setProperty("javax.net.ssl.trustStorePassword","welcome1");

      // creating the factory instance
      factEnv.put(ADIdentityStoreFactory.ST_SECURITY_PRINCIPAL,
                  "sramaset@upad.us.oracle.com");
      factEnv.put(ADIdentityStoreFactory.ST_SECURITY_CREDENTIALS,
                   "ntrtntrt");
      factEnv.put(ADIdentityStoreFactory.ST_LDAP_URL,
                  "ldaps://mynode.us.mycorp.com:123/");
      factEnv.put("java.naming.security.protocol","SSL");


      adFactory =  builder.getIdentityStoreFactory(
                    "oracle.security.idm.providers.ad.ADIdentityStoreFactory",
                    factEnv);

      // creating the store instance
      storeEnv.put(ADIdentityStoreFactory.ST_SUBSCRIBER_NAME,
                   "dc=upad,dc=us,dc=oracle,dc=com");
      adStore = adFactory.getIdentityStoreInstance(storeEnv);

      //get UserManager
      UserManager usrmanager = adStore.getUserManager();

      // create user
      String usrname = "amyd";
      // delete user if already exists
      try
      {
        User usr = adStore.searchUser(usrname);
        usrmanager.dropUser(usr);
      }catch(IMException ime){}

      System.out.println("creating user "+usrname);
      char[] password = {'w', 'e', 'l', 'c', 'o', 'm','e','3'};
      User usr = usrmanager.createUser(usrname, password);
      System.out.println("user (" +usr.getUniqueName() + ") created with guid="+usr.getGUID());
      System.out.println("user name = "+usr.getName() );

      // modifying user properties
      System.out.println("DISPLAY_NAME="+usr.getDisplayName());
      System.out.println("modifying property UserProfile.DISPLAY_NAME");
      UserProfile usrprofile = usr.getUserProfile();
      ModProperty mprop = new ModProperty(UserProfile.DISPLAY_NAME,
                                          "modified display name",
                                          ModProperty.REPLACE);
      usrprofile.setProperty(mprop);

      System.out.println("get property values UserProfile.DISPLAY_NAME");
      Property prop = usrprofile.getProperty(UserProfile.DISPLAY_NAME);
      List values = prop.getValues();
      Iterator itr = values.iterator();
      while(itr.hasNext())
      {
        System.out.println(UserProfile.DISPLAY_NAME+": "+ itr.next());
      }
      System.out.println();

      System.out.println("now verifying the password");
      boolean pass = false;
      try
      {
        usrmanager.authenticateUser(usrname, password);
        pass= true;
      }catch (oracle.security.idm.AuthenticationException e)
      {
        System.out.println(e);
        e.printStackTrace();
      }
      if (pass)
        System.out.println("password verification SUCCESS !!");
      else
        System.out.println("password verification FAILED !!");

      SimpleSearchFilter sf = adStore.getSimpleSearchFilter(
                    UserProfile.NAME, SimpleSearchFilter.TYPE_EQUAL, usrname);

      SearchParameters params = new SearchParameters();
      params.setFilter(sf);

      // Searching for users
      SearchResponse resp = adStore.searchUsers(params);
      System.out.println("Searched users are:");
      while (resp.hasNext())
      {
        Identity idy = resp.next();
        System.out.println("name: "+idy.getName()+"\tUnique name: "+idy.getUniqueName());
      }


      // drop user
      System.out.println("Now dropping user "+usrname);
      usrmanager.dropUser(usr);
      System.out.println("user dropped");

    }catch (Exception e)
    {
      e.printStackTrace();
    }
  }
}

19.8 LDAPベースのユーザーおよびロールAPIプロバイダのSSL構成

この項では、ユーザーおよびロールAPIのSSLサポートについて説明します。この項の内容は次のとおりです。

19.8.1 すぐに使用できるSSLのサポート

ユーザーおよびロールAPIのLDAPベースのプロバイダは、LDAPベースのアイデンティティ・ストアとのセキュアなSSL通信を可能にするために、Sun Java Secure Sockets Extension(JSSE)に依存しています。JSSEは、JDK 1.4以上に含まれます。

次のプロバイダがあります。

  • Microsoft Active Directory

  • Novell eDirectory

  • Sun Java System Directory Server

  • Oracle Internet Directory

  • OpenLDAP

  • Oracle WebLogic Server対応のLDAPディレクトリ

19.8.1.1 システム・プロパティ

SSLをサポートするには、次の情報をシステム・プロパティとして指定する必要があります。

javax.net.ssl.keyStore

javax.net.ssl.keyStorePassword

javax.net.ssl.trustStore

javax.net.ssl.trustStorePassword

詳細は、Sun Microsystems社のJSSEに関するドキュメントを参照してください。

19.8.1.2 SSL構成

ユーザーおよびロールAPIの構成を行う際は、SSL構成の詳細を設定する必要があります。

JVMに対してキーストアの場所とパスワードをシステム・プロパティとして指定します。

String keystore = "<key store location>";
String keypasswd = "<key store password>";
System.setProperty("javax.net.ssl.trustStore",keystore);
System.setProperty("javax.net.ssl.trustStorePassword", keypasswd);

IdentityStoreFactoryインスタンスの作成時に、環境に次のプロパティを指定します。

  1. 次の例にように、LDAPサーバーのSSL URLを設定します。

    factEnv.put(ADIdentityStoreFactory.ST_LDAP_URL,
     "ldaps://ldaphost:sslport/");
    
  2. 次のように、セキュリティ・プロトコルをSSLに設定します。

    factEnv.put("java.naming.security.protocol","SSL");
    

19.8.2 ユーザーおよびロールAPIのSSLサポートのカスタマイズ

ユーザーおよびロールAPIプロバイダのSSLSocketFactoryをカスタマイズすることにより、SSLサポートをカスタマイズすることができます。

19.8.2.1 SSL構成

IdentityStoreFactoryインスタンスの作成時に、次のプロパティを指定します。

  1. 次のように、カスタムSSLソケット・ファクトリ名を指定します。

    factEnv.put("java.naming.ldap.factory.socket",
    "fully qualified custom socket factory name");
    
  2. 次の例にように、LDAPサーバーのSSL URLを設定します。

    factEnv.put(ADIdentityStoreFactory.ST_LDAP_URL,
     "ldaps://ldaphost:sslport/");
    
  3. 次のように、セキュリティ・プロトコルをSSLに設定します。

    factEnv.put("java.naming.security.protocol","SSL");
    

19.9 ユーザーおよびロールAPIリファレンス

ユーザーおよびロールAPIのリファレンス(Javadoc)は、次のドキュメントにあります。

Oracle Fusion Middleware User and Role Java API Reference for Oracle Platform Security Services