Oracle® Fusion Middleware Oracle Platform Security Servicesによるアプリケーションの保護 12c (12.1.2) E47967-02 |
|
前 |
次 |
この章では、ユーザーおよびロールAPIを使用してアイデンティティ情報にアクセスする方法を説明します。
この章の内容は次のとおりです。
注意: ユーザーおよびロールAPIは現在非推奨となっており、今後のリリースでは廃止される可能性があります。新しいアプリケーションの開発にはIdentity Governance Frameworkを使用してください。今後のリリースで既存のアプリケーションをIdentity Governance Frameworkに移行することを計画してください。 詳細は、『Identity Governance Framework開発者ガイド』を参照してください。 |
ユーザーおよびロールAPIフレームワークを使用すると、アプリケーションは、基礎となるアイデンティティ・リポジトリの種類を問わず、統一的で移植可能な方法でアイデンティティ情報(ユーザーとロール)にアクセスすることができます。このリポジトリとして、Oracle Internet Directory、Active Directory (Microsoft社)、Oracle Directory Server Enterprise EditionなどのLDAPディレクトリ・サーバーや、データベース、フラット・ファイルなどのカスタム・リポジトリを使用できます。
このAPIフレームワークには、移植可能な方法でプログラム的にリポジトリにアクセスするための便利な方法が用意されているため、アプリケーション開発者は、個々のアイデンティティ・ソースに対応した複雑な処理を考慮するという煩雑な作業から解放されます。このフレームワークにより、アプリケーションは異なるリポジトリをシームレスに操作できるようになります。アプリケーションは、コードを変更しなくても、各種のアイデンティティ・リポジトリを切り替えて使用することができます。
サポートされる操作には、ユーザーとロールの作成、更新、削除のほか、ユーザーおよびロールの属性や特定の情報の検索などがあります。たとえば、特定のロールのすべてのユーザーの電子メール・アドレスを検索できます。
注意: これらのAPIは、認証機能または認可機能を対象としたものではなく、アイデンティティ情報の保持を目的としています。 |
基本使用モデル(コンテナ統合を使用しない)またはコンテナ統合を使用するモデル(コードの移植が可能)を使用できます。
Oracle WebLogic Serverコンテナのコンテキストの実行を目的としているアプリケーションでは、weblogic.security.principal.WLSUserImpl
にプリンシパル・クラスをキャストする必要があります。
注意: Oracle WebLogic ServerコンテナのコンテキストでユーザーおよびロールAPIを起動するには、次が必要です。
|
ユーザーおよびロールAPIを使用する際の注意
一般的に、認証はユーザーおよびロールAPIで実行せず、認証プロバイダでのみ実行する必要があります。
また、書込み権限のないユーザーの接続DNで認証プロバイダを構成することをお薦めします。
ユーザーおよびロールAPIは、最初のOracle WebLogic Server認証プロバイダを使用するように自動的に構成されるため、特別な構成は必要ありません。
ただし、ユーザーおよびロールAPIがその他の認証プロバイダを使用する場合は構成が必要です。
APIは、Oracle WebLogic Serverドメインにリストされている最初のLDAP認証プロバイダからのみデータにアクセスできます。複数の認証プロバイダが存在する場合は、各プロバイダの制御フラグの優先度によって優先順位が決まります。優先度が同じ場合は、最初のプロバイダが選択されます。リスト上で最初の認証プロバイダの下位にあるLDAP認証プロバイダにはアクセスしません。
WebLogic APIの同時使用について
アプリケーションでのLDAPサーバーのエントリの操作に、ユーザーおよびロールAPIとWebLogic LDAPAuthenticator API (EmbeddedLDAPAuthenticator、OracleInternetDirectoryAuthenticator、OracleVirturalDirectoryAuthenticatorなど)の両方を同時に使用しないでください。その理由を理解するには、同じLDAPサーバーにアクセスする2つのLDAPクライアントについて考えます。これらのクライアントはどちらもキャッシュが有効に設定されており、一方はエントリを削除しようとし、もう一方は削除対象のエントリを使用しようとしているとします。
この2つのクライアントが引き起こす競合を解決するには、キャッシュ機能を無効にし、クライアント間でLDAP操作を調整する必要があります。
表22-1は、ユーザーおよびロールAPIのクラスとインタフェースを示しています。
表22-1 ユーザーおよびロールAPIのクラスとインタフェース
名前 | タイプ | 説明 |
---|---|---|
AuthenticationException |
クラス |
アイデンティティ・ストアへのアクセス中に認証エラーが発生すると、この例外がスローされます。認証エラーは、ユーザー・プログラムで指定された資格証明が無効な場合や、該当アイデンティティ・ストアでユーザーを認証できなかったときなどに発生する場合があります。 |
AuthenticationWarningException |
クラス |
このクラスは、IMException(次の説明を参照)を拡張したものです。 |
ComplexSearchFilter |
インタフェース |
複合検索フィルタは、基礎となるアイデンティティ・リポジトリから得られる結果のフィルタ処理に使用できる、複合的な論理式を表します。複合検索フィルタは、複数のSearchFilterインスタンスを1つの論理演算子(ANDまたはOR)で組合したものです。コンポーネントとなる各SearchFilter自体を複合フィルタにできるため、複雑なネストした検索フィルタの作成が可能です。 複合検索フィルタの作成例については、Javadoc(第22.9項「ユーザーおよびロールAPIリファレンス」)を参照してください。 |
ConfigurationException |
クラス |
この例外は、構成に問題がある場合にスローされます。この例外は、サービス・プロバイダへのアクセスに必要な構成情報が不正であるか、見つからないときに発生する場合があります。 |
Identity |
インタフェース |
このインタフェースは、アイデンティティ・リポジトリ内の基本的なアイデンティティを表します。 |
IdentityStore |
インタフェース |
IdentityStoreは、実際のアイデンティティ・リポジトリへのハンドルを表します。このハンドルを使用して、リポジトリ内のアイデンティティを検索、作成、削除または変更することができます。 |
IdentityStoreFactory |
インタフェース |
IdentityStoreFactoryは、基礎となるアイデンティティ・リポジトリをプログラム的に表したものです。アイデンティティ・リポジトリへの実際のハンドルは、このオブジェクトの |
IdentityStoreFactoryBuilder |
クラス |
このクラスは、アイデンティティ・ストア・ファクトリを構築します。 |
IMException |
クラス |
この例外は、ADFのアイデンティティ管理APIによってスローされるすべての例外のスーパークラスです。サブクラスの名前が障害の性質を示します。 既知の直接サブクラスのリストについては、Javadoc(第22.9項「ユーザーおよびロールAPIリファレンス」)を参照してください。 |
ModProperty |
クラス |
このクラスは、プロパティ・オブジェクトの変更を表します。ModPropertyは、プロパティ名、変更後の値(複数指定可能)および変更のタイプとともにコールされます。変更のタイプは、 |
NoPermissionException |
クラス |
この例外は、APIコール元がパーミッションを持たない操作を実行しようとしたときにスローされます。アクセス制御とパーミッションのモデルは、基礎となるアイデンティティ・ストアによって規定されます。 |
ObjectExistsException |
クラス |
この例外は、指定された名前のアイデンティティがすでに基礎となるアイデンティティ・ストアに存在している場合にスローされます。たとえば、この例外は、ユーザー作成APIコールが既存のユーザーの名前でユーザーを作成しようとするときにスローされます。 |
ObjectNotFoundException |
クラス |
この例外は、指定されたアイデンティティがアイデンティティ・ストアに存在しない場合にスローされます。 |
OperationFailureException |
クラス |
この例外は、基礎となるアイデンティティ・ストアでの実行中に操作が失敗した場合にスローされます。 |
OperationNotSupportedException |
クラス |
この例外は、サービス・プロバイダが特定の操作をサポートしていない場合に、サービス・プロバイダによってスローされます。たとえば、この例外は、サービス・プロバイダがUserManagerをサポートしていない場合に、IdentityStore.getUserManager()をコールすると、サービス・プロバイダによってスローされます。 |
PasswordPolicyException |
クラス |
このクラスは、IMException(前述の説明を参照)を拡張したものです。 |
プロパティ |
クラス |
Propertyには名前/値の情報が含まれます。 |
PropertySet |
クラス |
プロパティの名前/値ペアのコレクション。プロパティの名前/値ペアの表現にはPropertyクラスが使用されます。PropertySetでは、同じ名前のプロパティが重複しないことが保証されます。 |
ロール |
インタフェース |
このインタフェースは、アイデンティティ・ストア内のロールを表します。 |
RoleManager |
インタフェース |
このインタフェースは、アイデンティティ・リポジトリ内でロールに関係する様々な操作の実行を管理するロール・マネージャを表します。 |
RoleProfile |
インタフェース |
このインタフェースは、ロールの詳細なプロファイルを表します。 |
SearchFilter |
インタフェース |
このインタフェースは、アイデンティティ・リポジトリの検索に使用される検索フィルタを表します。 |
SearchParameters |
クラス |
このクラスは、アイデンティティ・ストアの検索を実行するときに指定する必要のある検索パラメータを表します。このような検索パラメータには、次のものがあります。
|
SearchResponse |
インタフェース |
このインタフェースは、アイデンティティ・ストアの検索後に取得された検索結果を表します。実装は、サービス・プロバイダごとに固有です。 |
SimpleSearchFilter |
インタフェース |
このインタフェースは、アイデンティティ・リポジトリを検索するときに使用される簡易検索フィルタを表します。各簡易検索フィルタは、検索の属性またはプロパティ、評価演算子および値で構成される論理式です。この論理式が検索時に基礎となるアイデンティティ・リポジトリに適用され、一致した結果がフィルタ処理されて除外されます。 単純な検索フィルタの例については、Javadoc(第22.9項「ユーザーおよびロールAPIリファレンス」)を参照してください。 |
StoreConfiguration |
インタフェース |
StoreConfigurationは、特定のIdentityStoreインスタンスの構成プロパティを保持します。この構成オブジェクトのプロパティを変更することにより、該当するIdentityStoreインスタンスの動作を制御することができます。実際の構成プロパティとその値は、サービス・プロバイダに固有です。構成プロパティをまったくサポートしないサービス・プロバイダもあります。 |
SubjectParser |
インタフェース |
このインタフェースは、特定のサブジェクトからユーザーとロールのプリンシパルを抽出するユーティリティ・メソッドを提供します。このインタフェースの実装は、サービス・プロバイダが提供する必要があります。 |
ユーザー |
インタフェース |
このインタフェースは、アイデンティティ・ストア内のユーザーを表します。 |
UserManager |
インタフェース |
このインタフェースは、アイデンティティ・リポジトリ内でユーザーに関係する様々な操作の実行を管理する、ユーザー・マネージャを表します。 |
UserProfile |
インタフェース |
このインタフェースは、ユーザーの詳細なプロファイルを表します。汎用的な方法でユーザー・プロパティにアクセスすることができます。
|
この項では、プロバイダの基本的な概念とライフサイクルについて説明し、プロバイダを設定、構成および使用してOracle Platform Security Services環境でユーザー・リポジトリを操作する方法を説明します。
環境が正しく設定されていることを確認した後で、プロバイダを実装する際には、次の作業が必要になります。
基礎となるリポジトリの指定とそのリポジトリに適したプロバイダ・ファクトリ・クラスの選択
プロバイダ・ファクトリとアイデンティティ・ストアのインスタンスの作成
プロバイダの構成
この項の内容は次のとおりです。
ユーザーおよびロールAPIは、ユーザーとロールを管理するためにコールされますが、このAPIは基礎となるアイデンティティ・リポジトリと直接相互作用することはありません。セキュリティ・アプリケーションでは、かわりに、基礎となるリポジトリと実際の通信を実行するプロバイダが使用されます。このしくみでは、プロバイダと接続の情報を変更するだけで、基礎となる様々なリポジトリで同じコードを使用できるため、柔軟性が得られます。
この項では、ユーザーおよびロールAPIの環境を構成する方法について説明します。
環境には、次のようないくつかのjarファイルが必要です。
provider jarファイル。目的の基礎となるアイデンティティ・リポジトリを実装します。
ユーザーおよびロールAPIのjarファイル
プロバイダで必要とされる可能性のある、その他のコンポーネントのjarファイル(Toplink、jdbc、xdbなど)。
関連するjarファイルがアプリケーションのクラスパスに含まれていることを確認してください。
注意: この変更はOracle Virtual Directory用の認証システムにのみ適用してください。 |
ユーザー属性のフェッチ時の効率を高めるため、jps-config.xml
に次のエントリを追加し、検索対象のユーザー・オブジェクト・クラスを指定します。
. . <serviceInstance name="idstore.ldap" provider="idstore.ldap.provider"> <property name="idstore.config.provider" value="oracle.security.jps.wls.internal.idstore.WlsLdapIdStoreConfigProvider"/ > <property name="CONNECTION_POOL_CLASS" value="oracle.security.idm.providers.stdldap.JNDIPool"/> <extendedProperty> <name>user.object.classes</name> <values> <value>top</value> <value>person</value> <value>inetorgperson</value> <value>organizationalperson</value> <value>otherActiveDirectorySpecificClasses</value> ... </values> </extendedProperty> . .
Oracle Platform Security Servicesは、次のLDAPディレクトリをはじめとする様々なユーザー・リポジトリをサポートします。
Microsoft Active Directory
Novell eDirectory
Oracle Directory Server Enterprise Edition
Oracle Internet Directory
Oracle Virtual Directory
OpenLDAP
Oracle WebLogic Server対応のLDAPディレクトリ
Microsoft ADAM
IBM Tivoli
選択したアイデンティティ・リポジトリによって、そのプロバイダに使用するプロバイダ・クラスが決まります。プロバイダ・クラスには、ユーザーおよびロールAPIフレームワークで指定されているインタフェースを実装する必要があります。表22-2は、使用可能なプロバイダ・クラスを示しています。
表22-2 LDAPアイデンティティ・プロバイダ・クラス
プロバイダ | ファクトリ名 |
---|---|
Microsoft Active Directory |
oracle.security.idm.providers.ad.ADIdentityStoreFactory |
Novell eDirectory |
oracle.security.idm.providers.edir.EDIdentityStoreFactory |
Oracle Directory Server Enterprise Edition |
oracle.security.idm.providers.iplanet.IPIdentityStoreFactory |
Oracle Internet Directory |
oracle.security.idm.providers.oid.OIDIdentityStoreFactory |
OpenLDAP |
oracle.security.idm.providers.openldap.OLdapIdentityStoreFactory |
Oracle WebLogic Server対応のLDAPディレクトリ |
oracle.security.idm.providers.wlsldap.WLSLDAPIdentityStoreFactory |
Oracle Virtual Directory |
oracle.security.idm.providers.ovd.OVDIdentityStoreFactory |
Microsoft ADAM |
oracle.security.idm.providers.ad.ADIdentityStoreFactory |
IBM Tivoli |
oracle.security.idm.providers.openldap.OLdapIdentityStoreFactory |
プロバイダのクラス名を特定した後は、次の手順を実行してプロバイダを作成します。
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ハッシュ表は、ストア・インスタンス環境を指定します。
これらのハッシュ表の詳細は、第22.7.1項の例を参照してください。
構成は、使用するアイデンティティ・ストア・プロバイダに依存します。
すべてのタイプのLDAPベースのアイデンティティ・ストア・プロバイダの動作は、ファクトリ・インスタンスやストア・インスタンスの多数のプロパティを構成することにより、微調整することができます。次のプロパティは、LDAPベースのプロバイダにのみ関連しています。
URL
リポジトリが実行されるポート
リポジトリにアクセスするときに使用するユーザーとパスワード
サポートされているLDAPベースのプロバイダのリストは、第22.3.3項「プロバイダの選択」を参照してください。
この項では、プロバイダ構成に関する次の項目について説明します。
構成可能なプロパティは、次の2つのカテゴリに分類されます。
起動時の構成 - 命名規則として、ST_で始まるプロパティ名が使用されます。
実行時の構成 - 命名規則として、RT_で始まるプロパティ名が使用されます。
起動時の構成プロパティ
起動時の構成は1回のみ実行され、いったん設定されると、構成の設定はプロバイダのライフタイムにわたって永続します。
ST_SUBSCRIBER_NAMEを除いて、起動時のプロパティはプロバイダのファクトリ・インスタンスの作成時に指定されます。ST_SUBSCRIBER_NAMEは、ストア・インスタンスの作成時に設定されます。
表22-3は、起動時の構成プロパティを示しています。
表22-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インスタンスの作成時にデフォルト値が設定されますが、これは後から変更することができます。
表22-4は、実行時の構成プロパティを示しています。
表22-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のどのタイプかを決定します。 |
ユーザーおよびロールAPIでは、デフォルトでECIDのサポートが無効になっています。
APIを初期化するときは、ECIDサポートに対してST_ECID_ENABLED
プロパティをtrueに設定します。次に例を示します。
factEnv.put(OVDIdentityStoreFactory.ST_ECID_ENABLED, "true");
注意: この処理は、バックエンド・アイデンティティ・ストアとしてOracle Internet DirectoryまたはOracle Virtual Directoryを使用している場合にのみ必要です。これ以外のリポジトリ(Microsoft Active DirectoryやNovell eDirectoryなど)を使用している場合は不要です。 |
構成データは、次のタイミングで指定できます。
ファクトリ・インスタンスを作成するとき。
ストア・インスタンスを作成するとき。
実行時(ストア構成オブジェクトを使用)。
この項では、ファクトリ・インスタンス作成時のプロバイダの構成に関連するトピックを説明します。
この段階での構成は、そのファクトリ・オブジェクト全体、および、その特定のファクトリ・インスタンスを使用して作成されるオブジェクトに影響を与えます。次の一般的なプロパティをはじめとして、多くの起動時のプロパティがこの時点で設定されます。
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");
カスタム接続プールを使用するには、次のように、カスタム接続プール・クラスの完全修飾クラス名を指定する必要があります。
factEnv.put(OIDIdentityStoreFactory.ST_CONNECTION_POOL_CLASS, "oracle.security.idm.providers.stdldap.JNDIPool");
関連情報は、第J.5.1項「組込みのLDAP認証プロバイダへの接続の失敗」を参照してください。
ストアで一般的に使用される構成パラメータは、この時点で受け入れられる唯一の起動時プロパティである、ST_SUBSCRIBER_NAMEです。ストアで一般的に使用される構成パラメータは、この時点で受け入れられる唯一の起動時プロパティである、ST_SUBSCRIBER_NAMEです(すべての実行時プロパティはアイデンティティ・ストアの作成時に指定可能です。)
第22.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の場合は、STsubscriber名を正しいDNまたはレルムのニックネームで指定することができます。 |
前述の、第22.3.6項「ファクトリ・インスタンス作成時のプロバイダの構成」および第22.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”);
この項では、プロバイダとプロバイダ・アーティファクトの操作のヒントを説明します。
プロバイダを切り替えても(OpenLDAPプロバイダと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.getWildCardChar()
メソッドを使用します。これにより、基礎となるプロバイダに基づいて正しいワイルド・カード文字がフェッチされます。たとえば、このAPIは、データベース・プロバイダの場合は%
を返し、Oracle Internet Directoryプロバイダの場合は*
を返します。
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つのストア・インスタンス
委任管理サーバーなどのアプリケーションでは、各セッション(1人のユーザーのログインに対応)で作成/検索ベースやその他の様々な実行時設定を変更できます。これらはユーザーおよびロールAPIの実行時のプロパティとして定義します。IdentityStoreオブジェクトは、このようなすべての設定をカプセル化し、これに応じて実行時の動作を変更します。このような理由から、セッションごとに1つのIdentityStoreインスタンスというルールが適用されています。
プロバイダは、そのプロバイダ用に作成されたファクトリ・インスタンスが存続している間、存在し続けます。ファクトリ・インスタンスの寿命は、そのインスタンスに対してclose() APIがコールされると終了します。プロバイダ・インスタンスが終了すると、そのインスタンスを使用して作成されたすべてのオブジェクトは無効になり、そのようなオブジェクトに対するその後のAPIコールでは、予期しない結果が返されます。
IdentityStoreのインスタンスにも、同様の考慮事項が当てはまります。
注意:
|
ユーザーおよびロールAPIには、次の2種類の問合せ関数があります。
1つのアイデンティティを返す関数
アイデンティティのリストを返す関数
この項では、これらの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, String value);
これらの関数は、特定のユーザーまたはロールのアイデンティティがストアに存在することがわかっているときに、そのアイデンティティへのオブジェクト参照が必要な場合に実行する単純な問合せで効果的です。これらの関数の機能は、次の点で最小限になっています。
文字列値のみを受け取ります。
正規表現をサポートしません。
これらの関数では、同じ値を持つ複数のエンティティがストアに存在すると例外が発生します。
ユーザーおよびロールAPIには、検索を実行して複数のアイデンティティを返すことのできる、次のようないくつかの関数が含まれています。
IdentityStore.search(SearchParams params); IdentityStore.searchUsers(SearchParams params); IdentityStore.searchRoles(int searchType, SearchParams params); IdentityStore.searchProfiles(SearchParams params);
各関数は、検索オブジェクトを受け取り、検索レスポンス・オブジェクトを返します。
SearchParamsオブジェクト
SearchParamsオブジェクトには、次の情報が格納されます。
検索フィルタ - 第22.4.4項「検索フィルタの使用」を参照してください。
検索するアイデンティティ・タイプ - 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ユーザーはこれらの文字を別途に処理する必要はありません。
アプリケーションでは一般に、ログイン・ユーザーのアイデンティティおよびユーザーのグループ名を取得する必要があります。
Oracle WebLogic Serverの認証プロバイダでは、ユーザー関連の2つの属性user.login.attr
とgroupname.attr
を使用します。ログイン時、認証プロバイダはuser.login.attr
を使用してユーザーを格納し、groupname.attr
を使用してグループを格納します。
アプリケーションでは、UserProfile.getUserName()
(user.login.attr
にマップされる)を使用して、ログイン・ユーザーのアイデンティティを取得します。ロール(グループ)名を取得するには、RoleProfile.getProperty(RoleProfile.NAME
)(groupname.attr
にマップされる)を使用します。
この項では、いくつかの使用例を示します。
例22-1 名前によってユーザーを取得するための簡易フィルタ
簡易検索フィルタの実装は、基礎となるストアに依存します。検索フィルタのインスタンスはストア・インスタンスを使用して取得できます。
この例のフィルタでは、名前フィールドの値が非NULLであるすべてのエントリが許可されます。
SimpleSearchFilter sf = oidStore.getSimpleSearchFilter(UserProfile.NAME, SimpleSearchFilter.TYPE_EQUAL, null); sf.setValue(sf.getWildCardChar());
例22-2 言語プリファレンスによってユーザーを検索するための簡易フィルタ
この例では、優先言語が英語以外のユーザーが検索されます。
SimpleSearchFilter sf = oidStore.getSimpleSearchFilter( UserProfile.PREFERRED_LANGUAGE, SimpleSearchFilter.TYPE_EQUAL, "english"); sf.negate();
例22-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);
例22-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);
例22-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()); }
例22-6 ログイン・ユーザーのアイデンティティの取得
この例は、ログイン・ユーザーの取得方法を示しています。
SimpleSearchFilter sf = oidStore.getSimpleSearchFilter( UserProfile.USER_NAME, SimpleSearchFilter.TYPE_EQUAL, "sampleUserName"); SearchParameters ssp = new SearchParameters(sf, SearchParameters.SEARCH_USERS_ONLY); // Searching for users SearchResponse resp = oidStore.searchUsers(ssp); System.out.println("Searched users are:"); while (resp.hasNext()) { Identity idy = resp.next(); String foundUserName = ((User)idy).getUserProfile().getUserName(); System.out.println("Found user name: "+ foundUserName ); }
注意:
|
例22-7 ロール/グループ名の取得
この例は、ロール(グループ)名の取得方法を示しています。
Role aRole = idStore.searchRole(IdentityStore.SEARCH_BY_NAME, "sampleRoleName"); Property prop = aRole.getRoleProfile().getProperty(RoleProfile.NAME); List roleList = prop.getValues(); Iterator itr = roleList.iterator(); System.out.println("Searched roles are:"); while (itr.hasNext()) { String foundRoleName = (String)itr.next(); System.out.println("Found role name: "+ foundRoleName ); }
この例では、ユーザーおよびロール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をパスワードベースのユーザー認証に使用できます。(前述のとおり、この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つの関数を使用すると、ユーザーを容易に作成できます。
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の実際のアプリケーションを示したいくつかの例を取り上げます。
この例では、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(sf2.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();
}
}
}
ユーザーの検索とグループの検索
ユーザーを検索する場合、前述のSimpleSearchFilter
のように、UserProfile
を呼び出します。ただし、グループを検索する場合はRoleProfile
を使用します。
この例では、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@xyzt.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以上に含まれます。
このようなLDAPプロバイダとして、次のものがあります。
Microsoft Active Directory
Novell eDirectory
Oracle Directory Server Enterprise Edition
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
JSSEの完全な情報は、Java Secure Socket Extension (JSSE)リファレンス・ガイド(http://download.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html
)を参照してください。
ユーザーおよびロール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");
ユーザーおよびロールAPIのリファレンス(Javadoc)は、次のドキュメントにあります。
Oracle Fusion Middleware User and Role Java API Reference for Oracle Platform Security Services
この項では、セキュリティ開発者がアイデンティティ(ユーザーおよびロール)の管理に使用できるカスタム・プロバイダを開発する方法を説明します。内容は次のとおりです。
ユーザーおよびロールAPIには、カスタムのユーザーおよびロール・プロバイダの開発を可能にするサービス・プロバイダ・インタフェース(SPI)が用意されています。このサービス・プロバイダ・インタフェースを使用して、任意のアイデンティティ・データ・リポジトリで使用するカスタム・プロバイダを開発できます。
このSPIは、抽象クラスのセットであるoracle.security.idm.spi
パッケージとしてバンドルされています。カスタムのユーザーおよびロール・プロバイダは、要件に合せてこのSPIを拡張することで作成します。
ユーザーおよびロールAPIは、検索操作の機能と作成、読取り、更新および削除(CRUD)の各操作の機能を提供します。読取り専用機能に基づくユーザーおよびロール・プロバイダでは、検索操作のみがサポートされます。フル機能プロバイダでは、検索操作とCRUD操作の両方がサポートされます。つまり、フル機能プロバイダは、読取り専用プロバイダのスーパーセットです。
開発者は、要件に応じて読取り専用とフル機能のいずれのプロバイダを作成するかを選択します。
次の場合は、読取り専用プロバイダの開発が適切です。
基礎となるアイデンティティ・リポジトリが読取り専用モードで動作している場合
ユーザーおよびロールAPIを使用するアプリケーションでCRUD APIをコールしない場合
たとえば、SOAアイデンティティ・サービスで使用するプロバイダとしては読取り専用プロバイダが適切です。
この項では、プロバイダの実装に使用するクラスについて説明します。この項の内容は次のとおりです。
表22-5は、読取り専用プロバイダを実装するために拡張が必要となるSPIクラスを示しています。
注意: すべての抽象メソッドを実装する必要があります。 |
表22-5 カスタム・プロバイダ向けに拡張するSPIクラス
クラス | 使用方法 |
---|---|
oracle.security.idm.spi.AbstractIdentityStoreFactory |
この拡張クラスには、デフォルト・コンストラクタおよびjava.util.Hashtableオブジェクトを受け取るコンストラクタを追加する必要があります。 |
oracle.security.idm.spi.AbstractIdentityStore |
|
oracle.security.idm.spi.AbstractRoleManager |
|
oracle.security.idm.spi.AbstractUserManager |
|
oracle.security.idm.spi.AbstractRoleProfile |
|
oracle.security.idm.spi.AbstractUserProfile |
|
oracle.security.idm.spi.AbstractSimpleSearchFilter |
拡張元クラスのコンストラクタは、抽象(スーパー)クラスのコンストラクタをコールする必要があります。 |
oracle.security.idm.spi.AbstractComplexSearchFilter |
拡張元クラスのコンストラクタは、抽象(スーパー)クラスのコンストラクタをコールする必要があります。 |
oracle.security.idm.spi.AbstractSearchResponse |
次に、各クラスのその他の要件および使用方法を示します。
このSPIクラスを拡張するクラスには次のコンストラクタが必要です。
デフォルト・コンストラクタ(引数が指定されていないコンストラクタ)。
引数としてjava.util.Hashtable
オブジェクトを受け取るコンストラクタ。このハッシュ表を使用して、プロバイダで必要な構成プロパティを受け取ることができます。
この構成プロパティは、ユーザーおよびロールの構成段階でこのコンストラクタに渡されます。構成プロパティは、Hashtable
引数で渡すキーと値のペアです。
このキーはjava.lang.String
とする必要があります。
この値はjava.lang.Object
とする必要があります。
この値のタイプはString
にすることをお薦めします。これによって、テキスト・ファイルであるjps-config.xml
でプロパティを確実に指定できます。
「ユーザーおよびロールSPIリファレンス」には、このクラスでの実装が必要となるメソッドの詳細についての説明があります。次のことに留意してください:
メソッドgetStoreConfiguration()
はオプションですが、OperationNotSupportedException
をスローすることがあります。
メソッドgetSubjectParser()
はnull
を返すことがあります。
返す検索結果がない場合、すべての検索APIは次をスローします。
oracle.security.idm.ObjectNotFoundException
空のSearchResponse
が返されることはありません。
「ユーザーおよびロールSPIリファレンス」には、このクラスでの実装が必要となるメソッドの詳細についての説明があります。具体的な実際の実装が必要なメソッドは、次にあげるもののみです。
getGrantedRoles()
getOwnedRoles()
getManagedRoles()
isGranted()
isManagedBy()
isOwnedBy()
isDropRoleSupported()
- 必ずfalse
を返します。
isCreateRoleSupported()
- 必ずfalse
を返します。
isModifyRoleSupported()
- 必ずfalse
を返します。
残りのメソッドは、それぞれの実装で次の例外をスローする必要があります。
oracle.security.idm.OperationNotSupportedException
「ユーザーおよびロールSPIリファレンス」には、このクラスでの実装が必要となるメソッドの詳細についての説明があります。具体的な実際の実装が必要なメソッドは、次にあげるもののみです。
authenticateUser(User, char[])
authenticateUser(String, char[])
isDropUserSupported()
- 必ずfalse
を返します。
isCreateUserSupported()
- 必ずfalse
を返します。
isModifyUserSupported()
- 必ずfalse
を返します。
残りのメソッドは、それぞれの実装で次の例外をスローする必要があります。
oracle.security.idm.OperationNotSupportedException
oracle.security.idm.spi.AbstractRoleProfileは、詳細なロール・プロファイルを返すために使用できる抽象クラスです。
「ユーザーおよびロールSPIリファレンス」には、このクラスでの実装が必要となるメソッドの詳細についての説明があります。具体的な実際の実装が必要なメソッドは、次にあげるもののみです。
getDisplayName()
getGUID()
getName()
getUniqueName()
getPrincipal()
getDescription()
getGrantees()
getManagers()
getOwners()
getProperty()
- リクエストされたプロパティが、対応するロールに設定されていないか有効でない場合は、値としてnullが返されます。
isApplicationRole() - 必ずfalseを返します。
isEnterpriseRole() - 必ずfalseを返します。
isSeeded() - 必ずfalseを返します。
getRoleProfile() – 現在のオブジェクトへの参照を返します。
残りのメソッドは、それぞれの実装で次の例外をスローする必要があります。
oracle.security.idm.OperationNotSupportedException
oracle.security.idm.spi.AbstractUserProfile
は、詳細なユーザー・プロファイルを返すために使用できる抽象クラスです。
「ユーザーおよびロールSPIリファレンス」には、このクラスでの実装が必要となるメソッドの詳細についての説明があります。具体的な実際の実装が必要なメソッドは、次にあげるもののみです。
getDisplayName()
getGUID()
getName()
getUniqueName()
getPrincipal()
getProperty()
- リクエストされたプロパティが、対応するロールに設定されていないか有効でない場合は、null値が返されます。
getProperties()
– リクエストされたプロパティが、対応するユーザーに設定されていないか有効でない場合は、null値が返されます。
getAllUserProperties()
– 対応するユーザーに設定されているプロパティのみが返されます。
getReportees()
getManagementChain()
getUserProfile() – 現在のオブジェクトへの参照を返します。
次の2つのメソッドに関する考慮事項:
setProperty()
setProperties()
これらのメソッドは、それぞれの実装で次をスローする必要があります。
oracle.security.idm.OperationNotSupportedException
oracle.security.idm.spi.AbstractSimpleSearchFilter
は、単純な検索フィルタを実装するために拡張できる抽象クラスです。
実装クラスには、抽象クラスのコンストラクタをコールする次のようなコンストラクタが必要です。
AbstractSimpleSearchFilter ( String attrname, int type, Object value)
「ユーザーおよびロールSPIリファレンス」には、このクラスでの実装が必要となるメソッドの詳細についての説明があります。具体的な実際の実装が必要なメソッドは、次にあげるもののみです。
getNativeRepresentation()
– 基礎となるアイデンティティ・リポジトリで使用するネイティブな表現にフィルタを変換します。
getWildCardChar()
– 検索で使用する*などのワイルド・カード文字。具体的な文字は、基礎となるアイデンティティ・リポジトリによって異なります。
oracle.security.idm.spi.AbstractComplexSearchFilter
は、任意の複雑性を備えた検索フィルタを実装するために拡張できる抽象クラスです。
実装クラスには、抽象クラスのコンストラクタをコールする次のようなコンストラクタが必要です。
AbstractComplexSearchFilter ( oracle.security.idm.SearchFilter[] filters, int oper_type)
「ユーザーおよびロールSPIリファレンス」には、このクラスでの実装が必要となるメソッドの詳細についての説明があります。具体的な実際の実装が必要なメソッドは、次にあげるもののみです。
getNativeRepresentation()
– 基礎となるアイデンティティ・リポジトリで使用するネイティブな表現にフィルタを変換します。
SearchResponse
オブジェクトには、リポジトリから返された検索結果が格納されます。結果の各エントリは、基礎となるアイデンティティ・リポジトリにある1つのユーザーまたはロールに対応しており、対応するUserProfileクラスまたはRoleProfileクラスの実装によって表されます。
SearchResponse
オブジェクトは、1つ以上の結果を返す必要があります。つまり、hasNext()
メソッドは少なくとも1回はTRUE
を返す必要があります。
返す結果がない場合は使用しないでください。結果が返されないと、対応する検索APIが次の例外をスローします。
oracle.security.idm.ObjectNotFoundException
フル機能プロバイダでは、読取り専用プロバイダで使用できるすべての機能が実装され、さらにCRUD操作も使用できます。このため、CRUD APIをSPI実装クラスに実装する必要があります。
読取り専用プロバイダでは、OperationNotSupportedException
をスローするだけでこれらのAPIを実装しています(第22.10.3項「読取り専用プロバイダの開発」のクラスの説明を参照してください)。
フル機能プロバイダでは、対応するCRUD操作の具体的で実際の実装が必要になります。
この項では、プロバイダ開発のためのいくつかのガイドラインを示します。
名前のマッピング
UserProfile.NAME、UNIQUE_NAME、UserProfile.USER_NAME、UserProfile.USER_IDなどの命名定数の使用に注意してください。
NAME – 基礎となるリポジトリにあるユーザーまたはロールの名前
UNIQUE_NAME – 基礎となるリポジトリにあるユーザーまたはロールを表すフルネーム
USER_NAME – 基礎となるリポジトリにあるユーザーのログインID
USER_ID – USER_NAME定数のマッピングと必ず同一
アイデンティティ・リポジトリによっては、これらの定数が、基礎となるアイデンティティ・リポジトリの同一の属性にマップされることもあれば、異なる属性にマップされることもあります。基礎となるリポジトリがLDAP v3サーバーの場合、マッピングは次のようになります。
NAME – cnなど、ユーザー・エントリまたはグループ・エントリの命名属性にマップされます。
UNIQUE_NAME - ユーザー・エントリまたはグループ・エントリのDNにマップされます。
USER_NAME/USER_ID – uidやmailなどのログイン属性にマップされます。
スレッド・セーフティ
多くの場合、次のオブジェクトは複数のスレッドで共有されます。
IdentityStoreFactory
IdentityStore
UserManager
RoleManager
プロバイダの対応する実装クラスでスレッド・セーフティに関連する問題がないことを確認する必要があります。
ユーザーおよびロールAPIには、開発するプロバイダの基本操作をテストできるように、テスト・スイートが付属しています。
このテスト・スイートは、読取り専用プロバイダとフル機能プロバイダの両方のテストで使用できます。
使用方法
java oracle.security.idm.tests.SPITest propertiesfile
propertiesfileには、プロバイダ・クラス名とそのプロバイダのあらゆる構成データを格納します。また、実行するテストに関する情報も格納します。テストを実行する前に、このファイルを編集して、正しい情報で更新する必要があります。このファイルの内容は、見ればすぐわかるようになっています。このようなファイルの1つ(ffprovider.properties
)を、第22.10.7.1項「サンプル・プロバイダについて」で説明しているサンプル・プロバイダで使用しています。
結果
テストによって画面に結果が表示されます。開発するすべてのプロバイダが、テスト・スイートのルックアップ・テスト、ロール・メンバーシップ・テストおよびプロファイル・テストに合格する必要があります。フル機能プロバイダは、作成と削除のテストなど、スイートにあるすべてのテストに合格する必要があります。
テスト結果のログは、現在の作業ディレクトリのresults.out
ファイルに出力されます。
製品にはサンプルのアイデンティティ・プロバイダが付属しているので、それを使用してカスタム・プロバイダの作成方法を理解できます。
この項では、このサンプル・プロバイダにアクセスする方法と、カスタム・プロバイダを実装するために必要な手順について説明します。手順は、説明に使用するサンプルに依存します。
プロバイダの開発を支援するために、Oracle Technology Networkのサンプル・プロバイダを使用できます。このプロバイダを操作する手順は次のとおりです。
次のサンプル・コンテンツ・ページへ移動します。
検索ボックスで、sampleprovider-157582.zipを検索します。
ファイルをダウンロードし、解凍します。次の構造が生成されます。
sampleprovider/ build.xml - ant build file ffprovider.properties - properties file required for testing jlib - provider jar file location out - location of generated class files samples - Folder for samples src - provider source code
ant help
を実行すると、このプロバイダの作成とテストの手順を知ることができます。
このプロバイダは、非定型のアイデンティティ・リポジトリを使用してアイデンティティ情報をフェッチしており、Oracle SOA Suiteによるテストを完了しています。これは、実際の環境で適切なテストを実行せずに本番で使用することを意図したものではありません。
この例で使用するサンプルのアイデンティティ・プロバイダは、アイデンティティと認証のためのカスタム・プロバイダであり、基礎となるストアとしてRDBMSを使用しています。アイデンティティ・プロバイダおよび認証プロバイダの両方として使用できます。
注意: このサンプル・プロバイダは説明のみを目的としたものなので、十分なテストを経ずに本番で使用することはお薦めしません。 |
このサンプル・プロバイダを設定するには、次の手順が必要です。
ユーザーおよびロールAPIを実装して、アイデンティティ・ストアとして機能するデータベース・リポジトリにアクセスします。これには、次の処理が必要です。
サンプル・プロバイダの作成。その手順を知るには、ant help
を実行します。
データベースへのアイデンティティ・ストア・スキーマの作成。
第22.10.7.3項「サンプル・アイデンティティ・プロバイダの使用に向けたjps-config.xmlの構成」で示しているように、サンプル・プロバイダをアイデンティティ・ストアとして構成します。
第22.10.7.4項「Oracle WebLogic Serverの構成」の説明に従って、このプロバイダをSQLAuthenticatorとして使用するようにWeblogic認証プロバイダを設定します。
次のようにjps-config.xml
を構成して、サンプル・アイデンティティ・プロバイダをアイデンティティ・ストアとして使用できるようにします。
次のように、サービス・プロバイダ・リストに新しいプロバイダを追加します。
<serviceProviders> ............ <serviceProvider type="IDENTITY_STORE" name="custom.provider" class="oracle.security.jps.internal.idstore.generic.GenericIdentityStoreProvider"> <description>Custom IdStore Provider</description> </serviceProvider> </serviceProviders>
次のように、サービス・インスタンスを追加します。
<serviceInstances>
........
<serviceInstance name="idstore.custom" provider="custom.provider" location="dumb">
<description>Custom Identity Store Service Instance</description>
<property name="idstore.type" value="CUSTOM"/>
<property name="ADF_IM_FACTORY_CLASS"
value="custom_provider_identityStoreFactoryClassName"/>
<property name="DB_SERVER_NAME" value="db_server_name"/> <property name="DB_SERVER_PORT" value="db_port"/>
<property name="DB_DATABASE_NAME" value="db_service_name"/>
<property name="ST_SECURITY_PRINCIPAL" value="user_name"/>
<property name="ST_SECURITY_CREDENTIALS" value="password"/>
</serviceInstance>
........
<serviceInstances>
注意: サンプル・プロバイダのcustom_provider_identityStoreFactoryClassNameは、org.sample.providers.db.DBIdentityStoreFactoryです。 |
次のように、デフォルトのjpsContext
が、前述のステップ2で追加したアイデンティティ・ストアのサービス・インスタンスを指すようにします。
<jpsContext name="default"> <serviceInstanceRef ref="credstore"/> <serviceInstanceRef ref="keystore"/> <serviceInstanceRef ref="policystore.xml"/> <serviceInstanceRef ref="audit"/> <serviceInstanceRef ref="idstore.custom"/> </jpsContext>
カスタム・プロバイダのjarファイルのパスをクラスパスに追加します。
サーバーを再起動します。
最後のタスクとして、SQLAuthenticator
を使用するようにOracle WebLogic Serverを構成します。手順は次のとおりです。
Oracle WebLogic Serverコンソールにログインします。「セキュリティ・レルム」→「myrealm」→「プロバイダ」を選択します。「新規」をクリックして新しいプロバイダを追加します。
プロバイダの名前を入力し、認証タイプとして「SQLAuthenticator」を選択します。
「プロバイダ」ページで、新規作成した認証プロバイダをクリックします。
「制御フラグ」をSUFFICIENT
に設定します。「保存」をクリックします。
リスト内のすべての認証プロバイダについて、制御フラグをsufficientに設定します。
「プロバイダ固有」タブをクリックして、認証プロバイダのサーバーの詳細を入力します。プロバイダのスキーマの作成に使用したデータソース名を入力します。「保存」をクリックします。
「プロバイダ」タブに戻り、SQLAuthenticatorがリストの最上位になるようにプロバイダの順序を並べ替えます。
この項では、ユーザーおよびロールSPIリファレンス(Javadoc)を示し、パッケージ名security.idm.spiを持つSPIの各抽象クラスについて説明します。抽象クラスは次のとおりです。
このクラスは詳細なユーザー・プロファイルです。このクラスを使用すると、ユーザー・プロファイルの属性を設定または取得できます。
コンストラクタ
public AbstractUserProfile()
メソッド
public void setPassword( char[] oldPasswd, char[] newPasswd) public byte[] getUserCertificate() public void setUserCertificate( byte[] cert) public java.lang.String getEmployeeNumber() public void setEmployeeNumber( String employeeNumber) public java.lang.String getBusinessPostalAddr() public void setBusinessPostalAddr( String addr) public java.lang.String getBusinessPOBox() public void setBusinessPOBox( String pobox) public byte[] getJPEGPhoto() public void setJPEGPhoto( String imgpath) public java.lang.String getTimeZone() public void setTimeZone( String zone) public java.lang.String getDescription() public void setDescription( String desc) public java.lang.String getDepartmentNumber() public void setDepartmentNumber( String departmentnumber) public java.lang.String getGivenName() public void setGivenName( String givenname) public java.lang.String getBusinessEmail() public void setBusinessEmail( String email) public java.lang.String getBusinessPager() public void setBusinessPager( String pager) public java.lang.String getOrganization() public void setOrganization( String org) public void setName( String name) public java.lang.String getBusinessCity() public void setBusinessCity( String city) public java.lang.String getMaidenName() public void setMaidenName( String maidenname) public java.lang.String getDepartment() public void setDepartment( String dept) public java.lang.String getBusinessFax() public void setBusinessFax( String fax) public java.lang.String getUserName() public void setUserName( String uname) public java.lang.String getBusinessMobile() public void setBusinessMobile( String mobile) public java.lang.String getDateofHire() public void setDateofHire( String hiredate) public java.lang.String getTitle() public void setTitle( String title) public java.lang.String getNameSuffix() public void setNameSuffix( String suffix) public java.lang.String getMiddleName() public void setMiddleName( String middlename) public java.lang.String getHomePhone() public void setHomePhone( String homephone) public void setDisplayName( String dispname) public java.lang.String getEmployeeType() public void setEmployeeType( String emptype) public java.lang.String getLastName() public void setLastName( String lastname) public java.lang.String getDateofBirth() public void setDateofBirth( String dob) public java.lang.String getManager() public void setManager( String manager) public java.lang.String getBusinessState() public void setBusinessState( String state) public java.lang.String getHomeAddress() public void setHomeAddress( String homeaddr) public java.lang.String getBusinessStreet() public void setBusinessStreet( String street) public java.lang.String getBusinessPostalCode() public void setBusinessPostalCode( String postalcode) public java.lang.String getInitials() public void setInitials( String initials) public java.lang.String getUserID() public void setUserID( String userid) public java.lang.String getFirstName() public void setFirstName( String firstname) public java.lang.String getDefaultGroup() public void setDefaultGroup( String defgroup) public java.lang.String getOrganiztionalUnit() public void setOrganizationalUnit( String ouUnit) public java.lang.String getWirelessAcctNumber() public void setWirelessAcctNumber( String wirelessacct) public java.lang.String getBusinessPhone() public void setBusinessPhone( String phone) public java.lang.String getBusinessCountry() public void setBusinessCountry( String country) public java.lang.String getPreferredLanguage() public void setPreferredLanguage( String language) public java.lang.String getUIAccessMode() public void setUIAccessMode( String accessMode) public java.lang.Object getPropertyVal( String prop) public oracle.security.idm.SearchResponse getReportees( boolean direct) public java.util.List getManagementChain( int max, String upToManagerName, String upToTitle) public oracle.security.idm.PropertySet getAllUserProperties()
このクラスはユーザー・マネージャであり、基本的な認証メソッドを備えています。
コンストラクタ
public AbstractUserManager()
メソッド
public oracle.security.idm.User authenticateUser( String user_id, String authProperty, char[] passwd) public oracle.security.idm.User authenticateUser( User user, char[] passwd)
このクラスはユーザーを表します。
コンストラクタ
public AbstractUser()
メソッド
なし
この抽象クラスは、サブジェクト・パーサーのコンストラクタを提供します。
コンストラクタ
public AbstractSubjectParser()
メソッド
なし
この抽象クラスは、アイデンティティ・ストア構成のコンストラクタを提供します。
コンストラクタ
public AbstractStoreConfiguration()
メソッド
なし
この抽象クラスは、アイデンティティ・ストアの検索に使用できる単純な検索フィルタを表します。単純なフィルタはそれぞれ、検索属性、照合する演算子タイプおよび値で構成されます。検索結果は、この条件に基づいてフィルタ処理されます。このクラスは、基礎となる実際の表現(@link #getNativeRepresentation()
メソッドで指定)が実装に固有なので、抽象クラスになっています。このメソッドの固有の実装を設定することによって、任意のサービス・プロバイダでこのクラスを拡張できます。
コンストラクタ
public AbstractSimpleSearchFilter( String attrname, int type, Object value)
メソッド
表22-6は、AbstractSimpleSearchFilter
のメソッドを示しています。
表22-6 AbstractSimpleSearchFilterのメソッド
メソッド | 説明 |
---|---|
public void setAttribute( String name) |
属性名を設定します。 |
public void setType(int type) |
フィルタ・タイプを設定します。 |
public void setValue(Object value) |
属性値を設定します。 |
public java.lang.String getAttributeName() |
属性名を取得します。 |
public java.lang.Object getValue() |
属性値を取得します。 |
public int getType() |
フィルタ・タイプを取得します。 |
public void setNegate() |
検索フィルタの現在のNOT状態を否定します。切替えスイッチのように動作します。 |
public void negate() |
検索フィルタの現在のNOT状態を否定します。切替えスイッチのように動作します。 |
public boolean isNegated() |
検索フィルタの現在のNOT状態を返します。NOT演算子が設定されている場合は |
これは、検索レスポンスの結果を表す抽象クラスです。
コンストラクタ
public AbstractSearchResponse()
メソッド
なし
このクラスは、ロールの詳細なプロファイルを表します。
コンストラクタ
public AbstractRoleProfile()
メソッド
public oracle.security.idm.SearchResponse getManagers( SearchFilter filter, boolean direct) public oracle.security.idm.SearchResponse getManagers( SearchFilter filter) public oracle.security.idm.SearchResponse getOwners( SearchFilter filter, boolean direct) public oracle.security.idm.SearchResponse getOwners( SearchFilter filter) public void addManager( Principal principal) public void removeManager( Principal principal) public void addOwner( Principal principal) public void removeOwner( Principal principal) public boolean isOwnedBy( Principal principal) public boolean isManagedBy( Principal principal) public void addOwner( User user) public void removeOwner( User user) public void setDisplayName( String displayName) public void setDescription( String discription) public java.lang.String getDescription() public oracle.security.idm.Property getProperty( String propName)
このクラスは、ロール・マネージャの抽象表現です。
コンストラクタ
public AbstractRoleManager()
メソッド
public boolean isOwnedBy( Role role, Principal principal) public boolean isManagedBy( Role role, Principal principal) public oracle.security.idm.SearchResponse getOwnedRoles( Principal principal, boolean direct) public oracle.security.idm.SearchResponse getManagedRoles( Principal principal, boolean direct)
このクラスは、ロールのコンストラクタを提供します。
コンストラクタ
public AbstractRole()
メソッド
なし
このクラスは、アイデンティティ・ストア・ファクトリを表します。
コンストラクタ
public AbstractIdentityStoreFactory()
メソッド
public oracle.security.idm.IdentityStore getIdentityStoreInstance()
この抽象クラスは、アイデンティティ・ストアを表します。
コンストラクタ
public AbstractIdentityStore()
メソッド
public oracle.security.idm.RoleManager getRoleManager() public oracle.security.idm.UserManager getUserManager() public java.util.List getMandatoryUserPropertyNames() public java.util.List getUserPropertySchema()
このクラスは、複雑な検索フィルタを表します。このタイプの検索フィルタは、1つのブール型AND演算子またはOR演算子を使用して複数のSearchFilterインスタンスを結合する場合に使用します。構成要素となる各検索フィルタ自体に複雑なフィルタを使用できるので、複雑性の高いネストした検索フィルタの作成が可能です。
このクラスは、基礎となる実際の表現(@link #getNativeRepresentation()
メソッドで指定)が実装に固有なので、抽象クラスになっています。
このメソッドの固有の実装を作成することによって、任意のサービス・プロバイダでこのクラスを拡張できます。
コンストラクタ
public AbstractComplexSearchFilter( SearchFilter[] filters, int oper_type)
メソッド
表22-7 複雑な検索フィルタのメソッド
メソッド | 説明 |
---|---|
public void addFilterComponent( SearchFilter filter) |
この複雑なフィルタのリストに、構成要素であるSearchFilterを追加します。 |
public void setNegate() |
検索フィルタの現在のNOT状態を否定します。切替えスイッチのように動作します。 |
public void negate() |
検索フィルタの現在のNOT状態を否定します。切替えスイッチのように動作します。 |
public boolean isNegated() |
検索フィルタの現在のNOT状態を返します。NOT演算子が設定されている場合は |
public int getOperatorType() |
複数のSearchFilterを結合する論理演算子タイプ。 |