この章では、ユーザーおよびロール管理のAPIの使用方法を説明します。この情報を利用する前に、これらのAPIが使用されているコンテキストに精通しておくことを強くお薦めします。詳細は、次の章または項を参照してください。
第14章「Oracle Platform Security Servicesを使用したセキュアなアプリケーションの開発の概要」
第14.2.2項「ユーザーおよびロール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は、ユーザーおよびロールAPIのクラスとインタフェースを示しています。
表19-1 ユーザーおよびロールAPIのクラスとインタフェース
名前 | タイプ | 説明 |
---|---|---|
AuthenticationException |
クラス |
アイデンティティ・ストアへのアクセス中に認証エラーが発生すると、この例外がスローされます。認証エラーは、ユーザー・プログラムで指定された資格証明が無効な場合や、該当アイデンティティ・ストアでユーザーを認証できなかったときなどに発生する場合があります。 |
AuthenticationWarningException |
クラス |
このクラスは、IMException(次の説明を参照)を拡張したものです。 |
ComplexSearchFilter |
インタフェース |
複合検索フィルタは、基礎となるアイデンティティ・リポジトリから得られる結果のフィルタ処理に使用できる、複合的な論理式を表します。複合検索フィルタは、複数のSearchFilterインスタンスを1つの論理演算子(ANDまたはOR)で組合したものです。コンポーネントとなる各SearchFilter自体を複合フィルタにできるため、きわめて複雑なネストした検索フィルタの作成が可能です。 複合検索フィルタの作成例については、Javadoc(第19.9項「ユーザーおよびロールAPIリファレンス」)を参照してください。 |
ConfigurationException |
クラス |
この例外は、構成に問題がある場合にスローされます。この例外は、サービス・プロバイダへのアクセスに必要な構成情報が不正であるか、見つからないときに発生する場合があります。 |
Identity |
インタフェース |
このインタフェースは、アイデンティティ・リポジトリ内の基本的なアイデンティティを表します。 |
IdentityStore |
インタフェース |
IdentityStoreは、実際のアイデンティティ・リポジトリへのハンドルを表します。このハンドルを使用して、リポジトリ内のアイデンティティを検索、作成、削除または変更することができます。 |
IdentityStoreFactory |
インタフェース |
IdentityStoreFactoryは、基礎となるアイデンティティ・リポジトリをプログラム的に表したものです。アイデンティティ・リポジトリへの実際のハンドルは、このオブジェクトの |
IdentityStoreFactoryBuilder |
クラス |
このクラスは、アイデンティティ・ストア・ファクトリを構築します。 |
IMException |
クラス |
この例外は、ADFのアイデンティティ管理APIによってスローされるすべての例外のスーパー・クラスです。サブクラスの名前が障害の性質を示します。 既知の直接サブクラスのリストについては、Javadoc(第19.9項「ユーザーおよびロールAPIリファレンス」)を参照してください。 |
ModProperty |
クラス |
このクラスは、プロパティ・オブジェクトの変更を表します。ModPropertyは、プロパティ名、変更後の値(複数指定可能)および変更のタイプとともにコールされます。変更のタイプは、 |
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を使用して、ユーザーの任意のプロパティの読取りや変更を実行できます。
|
この項では、プロバイダの基本的な概念とライフサイクルについて説明し、プロバイダを設定、構成および使用してOracle Platform Security環境でユーザー・リポジトリを操作する方法を説明します。
環境が正しく設定されていることを確認した後で、プロバイダを実装する際には、次の作業が必要になります。
基礎となるリポジトリの指定とそのリポジトリに適したプロバイダ・ファクトリ・クラスの選択
プロバイダ・ファクトリとアイデンティティ・ストアのインスタンスの作成
プロバイダの構成
この項の内容は次のとおりです。
ユーザーおよびロールAPIは、ユーザーとロールを管理するためにコールされますが、このAPIは基礎となるアイデンティティ・リポジトリと直接相互作用することはありません。セキュリティ・アプリケーションでは、かわりに、基礎となるリポジトリと実際の通信を実行するプロバイダが使用されます。このしくみでは、プロバイダと接続の情報を変更するだけで基礎となる様々なリポジトリに同じコードを使用できるため、柔軟性が得られます。
provider jarファイル。目的の基礎となるアイデンティティ・リポジトリを実装します。
ユーザーおよびロールAPIのjarファイル
プロバイダで必要とされる可能性のある、その他のコンポーネントのjarファイル(Toplink、jdbc、xdbなど)。
関連するjarファイルがアプリケーションのクラスパスに含まれていることを確認してください。
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 |
プロバイダのクラス名を特定したら、次の手順を実行してプロバイダを作成します。
IdentityStoreFactoryBuilderクラスのgetIdentityStoreFactory
メソッドを使用して、ファクトリ・インスタンスを構築します。このビルダー・クラスAPIは、次の情報を受け取ります。
プロバイダのクラス名
必要な環境プロパティ(ハッシュ表から得られる)
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ハッシュ表は、ストア・インスタンス環境を指定します。
構成は、使用するユーザーおよびロール・プロバイダに依存します。
すべてのタイプのLDAPベースのアイデンティティ・ストア・プロバイダの動作は、ファクトリ・インスタンスやストア・インスタンスの多数のプロパティを構成することにより、微調整することができます。次のプロパティは、LDAPベースのプロバイダにのみ関連しています。
URL
リポジトリが実行されるポート
リポジトリにアクセスするときに使用するユーザーとパスワード
LDAPベースのプロバイダのリストは、第19.3.3項「プロバイダの選択」を参照してください。
構成可能なプロパティは、次の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のどのタイプかを決定します。 |
この項では、ファクトリ・インスタンス作成時のプロバイダの構成に関連するトピックを説明します。
この段階での構成は、そのファクトリ・オブジェクト全体、および、その特定のファクトリ・インスタンスを使用して作成されるオブジェクトに影響を与えます。次の一般的なプロパティをはじめとして、多くの起動時のプロパティがこの時点で設定されます。
ST_LDAP_URL: LDAPリポジトリのURL
ST_SECURITY_PRINCIPAL: ユーザー名
ST_SECURITY_CREDENTIAL: リポジトリへの接続に必要なユーザー資格証明
次の例では、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);
注意: イタリックの値は実行前に適切な値に置換する必要があります。 |
ユーザーおよびロール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
という名前のログ・ファイルにリダイレクトされます。
ファクトリの作成時に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);
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");
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.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”);
この項では、プロバイダとプロバイダ・アーティファクトの操作のヒントを説明します。
プロバイダを切り替えるとき(FusionDBプロバイダからOracle Internet Directoryプロバイダ、またはその逆など)にアプリケーションの移植性を保証するため、ユーザーおよびロールAPIを操作するときには、次のガイドラインに従ってください。
ユーザー・プロパティを参照するときには、対応するoracle.security.idm.UserProfile
定数のみを使用します。アイデンティティ・リポジトリ間で移植不可能なネイティブの名前は使用しないでください。たとえば、アプリケーションでユーザーのログイン名を取得する必要がある場合は、次のようにUserProfile.USER_NAME
定数を使用してフェッチします。
Property prop = usrprofile.getProperty(UserProfile.USER_NAME);
理由は明らかですが、ほとんどの標準的なユーザー・プロパティには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);
検索フィルタを作成するときには、検索フィルタの文字列内で直接ネイティブのワイルド・カード文字を使用しないでください。かわりに、SimpleSearchFilter.getWildCardCharacter()
APIを使用します。これにより、基礎となるプロバイダに基づいて正しいワイルド・カード文字がフェッチされます。たとえば、このAPIは、FusionDBプロバイダの場合は%
を返し、Oracle Internet Directory(OID)プロバイダの場合は*
を返します。
SmpleSearchFilter sf = m_identityStore.getSimpleSearchFilter( attrName, SimpleSearchFilter.TYPE_EQUAL, null); sf.setValue( filterStringWithoutWildcard+sf.getWildCardChar());
アプリケーションが事前定義済のワイルド・カード文字を含むユーザー指定のフィルタ文字列を受け入れる場合は、ユーザーおよびロール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のフィルタ・フォーマットに変換されます。
スレッド・セーフティ
現在のIdentityStoreの実装は、スレッドセーフではありません。ユーザーおよびロールAPIでは、ストア・インスタンスは通常はスレッド間で共有されないと想定されています。ストア・インスタンスがスレッド間で共有される場合は、スレッド・セーフティに要求されるすべての問題点にアプリケーション・コードで対処する必要があります。
スレッド・セーフティとパフォーマンスの間には、トレードオフが存在します。スレッド・セーフティを実装する必要のあるユースケースでは、実装によるパフォーマンスへの影響を考慮に入れる必要があります。
セッションごとに1つのストア・インスタンス
DASなどのアプリケーションでは、(対応するログイン・ユーザーごとに)各セッションで作成/検索ベースやその他の様々な実行時設定を変更することができます。これらはユーザーおよびロールAPIの実行時のプロパティとして定義されます。IdentityStoreオブジェクトは、このようなすべての設定をカプセル化し、これに応じて実行時の動作を変更します。このような理由から、セッションごとに1つのIdentityStoreインスタンスというルールが適用されています。
プロバイダは、そのプロバイダ用に作成されたファクトリ・インスタンスが存続している間、存在し続けます。ファクトリ・インスタンスの寿命は、そのインスタンスに対してclose() APIがコールされると終了します。プロバイダ・インスタンスが終了すると、そのインスタンスを使用して作成されたすべてのオブジェクトは無効になり、そのようなオブジェクトに対するその後のAPIコールでは、予期しない結果が返されます。
IdentityStoreのインスタンスにも、同様の考慮事項が当てはまります。
注意:
|
ユーザーおよびロールAPIには、次の2種類の問合せ関数があります。
1つのアイデンティティを返すAPI
アイデンティティのリストを返すAPI
この項では、これらのAPIを使用して実行可能な次の検索および関連タスクについて説明し、検索パラメータの指定方法を詳細に示します。
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の機能は、次の点で最小限になっています。
文字列値のみを受け取る。
正規表現をサポートしない。
これらの関数では、ストア内に同じ値を持つ複数のエンティティが存在すると例外が発生します。
ユーザーおよびロールAPIには、検索を実行して複数のアイデンティティを返すことのできる、次のようないくつかの関数が含まれています。
IdentityStore.search(SearchParams params); IdentityStore.searchUsers(SearchParams params); IdentityStore.searchRoles(int searchType, SearchParams params); IdentityStore.searchProfiles(SearchParams params);
各関数は、検索オブジェクトを受け取り、検索レスポンス・オブジェクトを返します。
SearchParamsオブジェクト
SearchParamsオブジェクトには、次の情報が格納されます。
検索フィルタ: 後で説明します。
検索するアイデンティティ・タイプ: Roles
またはUsers
アイデンティティ・タイプを検索できます。
ページ・サイズ: デフォルトでは、ページング・オプションは無効になっています。問合せでページングが必要な場合は、ページ・サイズを適切な正の値に設定してください。
タイムアウト制限: タイムアウトは秒単位で指定されます。
件数制限: 問合せによって返される結果の数を制限します。
SearchResponseオブジェクト
SearchResponseは、複数のアイデンティティを取得するときに使用されるデータ構造体です。コードでは、次の関数を使用して、この構造体に格納された複数のアイデンティティを繰り返し処理できます。
hasNext()
: さらに要素が存在する場合はtrue
を返し、そうでない場合はfalse
を返します。
next()
: 次の要素が使用可能であればその要素を返し、そうでなければ例外を返します。
ユーザーおよびロールAPIには、様々な検索操作を容易に実行するための各種の検索フィルタが含まれています。この項では、検索フィルタの使用方法の重要なポイントについて説明します。
検索フィルタの演算子を使用するときには、次のルールを順守してください。
サポートされる演算子
標準のLDAPストアは、=(等号演算子)、<(未満演算子)、>(超過演算子)、&(AND演算子)、|(OR演算子)および!(NOT演算子)のみを受け入れます。IdentityStoreでは、さらに2つの演算子<=(以下)および>=(以上)が用意されており、使用しやすくなっています。
演算子=、<、>、<=および>=は簡易検索フィルタの作成に使用され、演算子&および|は2つ以上の検索文字列の組合せによる複合検索フィルタの作成に使用されます。
NOT演算子
NOT
演算子は、簡易検索フィルタと複合検索フィルタの両方で使用できます。この演算子は、フィルタの状態を否定する、つまりフィルタによって前に拒否されたエンティティを受け入れるように(またはその逆に)フィルタの状態を変更するために使用します。
NOT演算子には、次のSearchFilter
APIを使用してアクセスできます。
void negate();
boolean isNegated();
RFC-2254(LDAP検索フィルタの文字列表現)に従って、*、(、)、\およびNULL文字は個別に処理する必要があります。ユーザーおよびロールAPIは、演算子(、)および\を処理しますが、LDAPストアのワイルドカード文字でもある*演算子は処理されません。これらの文字はユーザーおよびロールAPIフレームワークで処理されるため、APIユーザーはこれらの文字を別途に処理する必要はありません。
ここでは、いくつかの使用例を示します。
例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()); }
この例では、ユーザーおよびロール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());
検証目的で、ユーザーおよびロールAPIをパスワードベースのユーザー認証に使用できます。
authenticateUser
APIは、ユーザー・ログイン名を受け取り、指定されたパスワードを使用してユーザーの認証を試みます。認証が成功した場合は、ユーザー・オブジェクトを返します。
パスワードベースの認証の例を次に示します。
store.getUserManager().authenticateUser(“testuser”,”password”);
ユーザーおよびロールAPIを使用すると、アイデンティティ・ストアへの新規アイデンティティの追加やストアでのアイデンティティの変更が容易になります。UserManagerクラスとRoleManagerクラスは、それぞれ、ユーザーとロールに固有のデータの作成、変更および削除操作を処理します。
UserManagerとRoleManagerのインスタンスは、ストア・インスタンスから次のようにして取得できます。
UserManager um = oidStore.getUserManager(); RoleManager rm = oidStore.getRoleManager();
この項の内容は次のとおりです。
RFC-2253によって、LDAP v3の識別名の文字列表現が定義されます。つまり、RFCで指定されたすべての文字が処理されます。ユーザーおよびロールAPIのユーザーは、これらの特殊文字をエスケープ/エスケープ解除する必要はありません。特殊文字をエスケープ/エスケープ解除すると、間違った結果になります。
これによって、空のプロパティを使用してアイデンティティを作成するときに問題が生じる可能性があります。この場合、RDN名を使用して様々な必須属性の値が指定されます。これらの必須属性の中には、より厳格な検証ルールが適用されるものもあります。その場合は、アイデンティティの作成が失敗して、例外が発行されます。
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
の値が指定されます。
アイデンティティを変更するには、そのアイデンティティへの参照が必要です。User、UserProfile、Role、RoleProfileの各クラスに、アイデンティティの変更を容易にするための次のようなAPIが用意されています。
user.setProperty(ModPropertyprop
); 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段階の手順になります。
アイデンティティの削除には、dropUser
とdropRole
の各APIを使用します。
アイデンティティを削除する場合は、コードにユーザーとロールの両方の参照が必要になります。
例を次に示します。
User usr; Role role; … … usrmanager.dropUser(usr); rolemanager.dropRole(role);
この項では、ユーザーおよびロールAPIの実際のアプリケーションを示した3つの例を取り上げます。
この例では、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();
}
}
}
この例では、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();
}
}
}
この例では、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(); } } }
この項では、ユーザーおよびロールAPIの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ディレクトリ
SSLをサポートするには、次の情報をシステム・プロパティとして指定する必要があります。
javax.net.ssl.keyStore javax.net.ssl.keyStorePassword javax.net.ssl.trustStore javax.net.ssl.trustStorePassword
詳細は、Sun Microsystems社のJSSEに関するドキュメントを参照してください。
ユーザーおよびロール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
インスタンスの作成時に、環境に次のプロパティを指定します。
次の例にように、LDAPサーバーのSSL URLを設定します。
factEnv.put(ADIdentityStoreFactory.ST_LDAP_URL, "ldaps://ldaphost:sslport/");
次のように、セキュリティ・プロトコルをSSLに設定します。
factEnv.put("java.naming.security.protocol","SSL");
ユーザーおよびロールAPIプロバイダのSSLSocketFactory
をカスタマイズすることにより、SSLサポートをカスタマイズすることができます。
IdentityStoreFactory
インスタンスの作成時に、次のプロパティを指定します。
次のように、カスタムSSLソケット・ファクトリ名を指定します。
factEnv.put("java.naming.ldap.factory.socket",
"fully qualified custom socket factory name");
次の例にように、LDAPサーバーのSSL URLを設定します。
factEnv.put(ADIdentityStoreFactory.ST_LDAP_URL, "ldaps://ldaphost:sslport/");
次のように、セキュリティ・プロトコルをSSLに設定します。
factEnv.put("java.naming.security.protocol","SSL");