ヘッダーをスキップ
Oracle® Fusion Middlewareアプリケーション・セキュリティ・ガイド
11g リリース1(11.1.1)
B56235-06
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

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

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


注意:

ユーザーおよびロールAPIは現在非推奨となっており、今後のリリースでは廃止される可能性があります。新しいアプリケーションの開発にはIdentity Governance Frameworkを使用してください。今後のリリースで既存のアプリケーションをIdentity Governance Frameworkに移行することを計画してください。

詳細は、Oracle Fusion Middleware Identity Governance Framework ArisID API開発者ガイドを参照してください。


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

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

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

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


注意:

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


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

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


注意:

ユーザーおよびロールAPIを呼び出すには、次のことが条件になります。

  • アイデンティティ・ストアがLDAPベースであること

  • ドメイン管理サーバーが稼働していること


ユーザーおよびロールAPIを使用する際の注意

一般的に、認証はユーザーおよびロールAPIで実行せず、認証プロバイダでのみ実行する必要があります。

また、書込み権限のないユーザーの接続DNで認証プロバイダを構成することをお薦めします。

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

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

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

APIは、Oracle WebLogic Serverドメインにリストされている最初のLDAP認証プロバイダからのみデータにアクセスできます。複数の認証プロバイダが存在する場合は、各プロバイダの制御フラグの優先度によって優先順位が決まります。優先度が同じ場合は、最初のプロバイダが選択されます。リスト上で最初の認証プロバイダの下位にあるLDAP認証プロバイダにはアクセスしません。

WebLogic APIの同時使用について

アプリケーションでのLDAPサーバーのエントリの操作に、ユーザーおよびロールAPIとWebLogic LDAPAuthenticator API (EmbeddedLDAPAuthenticator、OracleInternetDirectoryAuthenticator、OracleVirturalDirectoryAuthenticatorなど)の両方を同時に使用しないでください。その理由を理解するには、同じLDAPサーバーにアクセスする2つのLDAPクライアントについて考えます。これらのクライアントはどちらもキャッシュが有効に設定されており、一方はエントリを削除しようとし、もう一方は削除対象のエントリを使用しようとしているとします。

この2つのクライアントが引き起こす競合を解決するには、キャッシュ機能を無効にし、クライアント間でLDAP操作を調整する必要があります。

25.2 ロールとクラスの要約

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

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

名前 タイプ 説明

AuthenticationException

クラス

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

AuthenticationWarningException

クラス

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

ComplexSearchFilter

インタフェース

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

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

ConfigurationException

クラス

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

Identity

インタフェース

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

IdentityStore

インタフェース

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

IdentityStoreFactory

インタフェース

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

IdentityStoreFactoryBuilder

クラス

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

IMException

クラス

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

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

ModProperty

クラス

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

NoPermissionException

クラス

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

ObjectExistsException

クラス

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

ObjectNotFoundException

クラス

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

OperationFailureException

クラス

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

OperationNotSupportedException

クラス

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

PasswordPolicyException

クラス

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

プロパティ

クラス

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

PropertySet

クラス

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

ロール

インタフェース

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

RoleManager

インタフェース

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

RoleProfile

インタフェース

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

SearchFilter

インタフェース

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

SearchParameters

クラス

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

  • 検索フィルタ

  • 検索するアイデンティティ・タイプ

  • ページ・サイズ

  • 時間制限

  • 件数制限

SearchResponse

インタフェース

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

SimpleSearchFilter

インタフェース

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

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

StoreConfiguration

インタフェース

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

SubjectParser

インタフェース

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

ユーザー

インタフェース

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

UserManager

インタフェース

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

UserProfile

インタフェース

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

userのあらゆるプロパティの読取りまはた変更には、次のAPIを使用できます。

  • getProperty(java.lang.String)

  • getProperties(java.lang.String[])

  • setProperty(oracle.security.idm.ModProperty)

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


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

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

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

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

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

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

25.3.2 環境の設定

Jarの構成

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

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

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

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

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

jps-config.xml内のユーザー・クラス(Oracle Virtual Directoryのみ)


注意:

この変更は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>
.
.

25.3.3 プロバイダの選択

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フレームワークで指定されているインタフェースを実装する必要があります。表25-2は、使用可能なプロバイダ・クラスを示しています。

表25-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


25.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ハッシュ表は、ストア・インスタンス環境を指定します。

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

構成は、使用するアイデンティティ・ストア・プロバイダに依存します。

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

  • URL

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

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

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

この項では、プロバイダ構成に関する次の項目について説明します。

25.3.5.1 起動時と実行時の構成

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

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

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

起動時の構成プロパティ

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

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

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

表25-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インスタンスの作成時にデフォルト値が設定されますが、これは後から変更することができます。

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

表25-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のどのタイプかを決定します。


25.3.5.2 ECID伝播

ユーザーおよびロール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など)を使用している場合は不要です。


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

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

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

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

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

  • ST_LDAP_URL: LDAPリポジトリのURL

  • ST_SECURITY_PRINCIPAL: ユーザー名

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

25.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);

注意:

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


25.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という名前のログ・ファイルにリダイレクトされます。

25.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);

25.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");

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

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

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

関連情報は、第L.6項「組込みのLDAP認証プロバイダへの接続の失敗」を参照してください。

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

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

第25.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またはレルムのニックネームで指定することができます。


25.3.8 実行時の構成

前述の、第25.3.6項「ファクトリ・インスタンス作成時のプロバイダの構成」および第25.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”);

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

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

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

プロバイダを切り替えても(OpenLDAPプロバイダと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.getWildCardChar()メソッドを使用します。これにより、基礎となるプロバイダに基づいて正しいワイルド・カード文字がフェッチされます。たとえば、このAPIは、データベース・プロバイダの場合は%を返し、Oracle Internet Directoryプロバイダの場合は*を返します。

    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のフィルタ・フォーマットに変換されます。

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

アプリケーションをコーディングするときは、次の考慮事項に留意してください。

スレッド・セーフティ

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

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

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

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

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

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

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


注意:

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

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


25.4 リポジトリの検索

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

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

25.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);

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

  • 文字列値のみを受け取ります。

  • 正規表現をサポートしません。

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

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

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

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

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

25.4.3 検索パラメータの指定

SearchParamsオブジェクト

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

  • 検索フィルタ: 第25.4.4「検索フィルタの使用」を参照してください。

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

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

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

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

SearchResponseオブジェクト

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

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

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

25.4.4 検索フィルタの使用

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

25.4.4.1 検索フィルタの演算子

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

サポートされる演算子

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

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

NOT演算子

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

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

  • void negate();

  • boolean isNegated();

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

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

25.4.4.3 ログイン・ユーザー用の検索フィルタ

アプリケーションでは一般に、ログイン・ユーザーのアイデンティティおよびユーザーのグループ名を取得する必要があります。

Oracle WebLogic Serverの認証プロバイダでは、ユーザー関連の2つの属性user.login.attrgroupname.attrを使用します。ログイン時、認証プロバイダはuser.login.attrを使用してユーザーを格納し、groupname.attrを使用してグループを格納します。

アプリケーションでは、UserProfile.getUserName()(user.login.attrにマップされる)を使用して、ログイン・ユーザーのアイデンティティを取得します。ロール(グループ)名を取得するには、RoleProfile.getProperty(RoleProfile.NAME)(groupname.attrにマップされる)を使用します。

ログイン・ユーザーおよびロールの取得方法を示すサンプル・コールを、それぞれ例25-6例25-7に示します。

25.4.4.4 検索フィルタの使用例

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

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

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

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

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

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

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

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

例25-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); 

例25-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); 

例25-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());
}

例25-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(params);
   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 );
   }

注意:

((User)idy).getNameによって返される名前はRDNから導出されたもので、ログイン名と異なる場合があります。


例25-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 );
    }

25.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());

25.5 ユーザー認証

検証目的で、ユーザーおよびロールAPIをパスワードベースのユーザー認証に使用できます(前述のとおり、このAPIは認証および認可を目的とはしていません)。

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

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

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

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

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

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

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

この項のトピックは次のとおりです:

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

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

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

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

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の値が指定されます。

25.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段階の手順になります。

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

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

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

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

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

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

25.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();
    }
  }
}

ユーザーの検索とグループの検索

ユーザーを検索する場合、前述のSimpleSearchFilterのように、UserProfileを呼び出します。ただし、グループを検索する場合はRoleProfileを使用します。

25.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();
    }
  }
}

25.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();
    }
  }
}

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

この項では、ユーザーおよびロールAPIのSSLサポートについて説明します。次のトピックが含まれます:

25.8.1 すぐに使用できる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ディレクトリ

25.8.1.1 システム・プロパティ

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

javax.net.ssl.keyStore
 
javax.net.ssl.keyStorePassword
 
javax.net.ssl.trustStore
 
javax.net.ssl.trustStorePassword

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

25.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");
    

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

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

25.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");
    

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

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

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

25.10 カスタムのユーザーおよびロール・プロバイダの開発

この項では、セキュリティ開発者がアイデンティティ(ユーザーおよびロール)の管理に使用できるカスタム・プロバイダを開発する方法を説明します。次のトピックが含まれます:

25.10.1 SPIの概要

ユーザーおよびロールAPIには、カスタムのユーザーおよびロール・プロバイダの開発を可能にするサービス・プロバイダ・インタフェース(SPI)が用意されています。このサービス・プロバイダ・インタフェースを使用して、任意のアイデンティティ・データ・リポジトリで使用するカスタム・プロバイダを開発できます。

このSPIは、抽象クラスのセットであるoracle.security.idm.spiパッケージとしてバンドルされています。カスタムのユーザーおよびロール・プロバイダは、要件に合せてこのSPIを拡張することで作成します。

25.10.2 ユーザーおよびロール・プロバイダのタイプ

ユーザーおよびロールAPIは、検索操作の機能と作成、読取り、更新および削除(CRUD)の各操作の機能を提供します。読取り専用機能に基づくユーザーおよびロール・プロバイダでは、検索操作のみがサポートされます。フル機能プロバイダでは、検索操作とCRUD操作の両方がサポートされます。つまり、フル機能プロバイダは、読取り専用プロバイダのスーパーセットです。

開発者は、要件に応じて読取り専用とフル機能のいずれのプロバイダを作成するかを選択します。

次の場合は、読取り専用プロバイダの開発が適切です。

  • 基礎となるアイデンティティ・リポジトリが読取り専用モードで動作している場合

  • ユーザーおよびロールAPIを使用するアプリケーションでCRUD APIをコールしない場合

たとえば、SOAアイデンティティ・サービスで使用するプロバイダとしては読取り専用プロバイダが適切です。

25.10.3 読取り専用プロバイダの開発

この項では、プロバイダの実装に使用するクラスについて説明します。この項の内容は次のとおりです。

25.10.3.1 拡張が必要なSPIクラス

表25-5は、読取り専用プロバイダを実装するために拡張が必要となるSPIクラスを示しています。


注意:

すべての抽象メソッドを実装する必要があります。


表25-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



次に、各クラスのその他の要件および使用方法を示します。

25.10.3.2 oracle.security.idm.spi.AbstractIdentityStoreFactory

このSPIクラスを拡張するクラスには次のコンストラクタが必要です。

  1. デフォルト・コンストラクタ(引数が指定されていないコンストラクタ)。

  2. 引数としてjava.util.Hashtableオブジェクトを受け取るコンストラクタ。このハッシュ表を使用して、プロバイダで必要な構成プロパティを受け取ることができます。

    この構成プロパティは、ユーザーおよびロールの構成段階でこのコンストラクタに渡されます。構成プロパティは、Hashtable引数で渡すキーと値のペアです。

    • このキーはjava.lang.Stringとする必要があります。

    • この値はjava.lang.Objectとする必要があります。

この値のタイプはStringにすることをお薦めします。これによって、テキスト・ファイルであるjps-config.xmlでプロパティを確実に指定できます。


関連項目:

ユーザーおよびロールSPIリファレンス」: このクラスで実装する必要があるメソッドの詳細。ここにあげられているメソッドをすべて実装する必要があります


25.10.3.3 oracle.security.idm.spi.AbstractIdentityStore

ユーザーおよびロールSPIリファレンス」には、このクラスでの実装が必要となるメソッドの詳細についての説明があります。次のことに留意してください:

  • メソッドgetStoreConfiguration()はオプションですが、OperationNotSupportedExceptionをスローすることがあります。

  • メソッドgetSubjectParser()nullを返すことがあります。

返す検索結果がない場合、すべての検索APIは次をスローします。

oracle.security.idm.ObjectNotFoundException 

空のSearchResponseが返されることはありません

25.10.3.4 oracle.security.idm.spi.AbstractRoleManager

ユーザーおよびロールSPIリファレンス」には、このクラスでの実装が必要となるメソッドの詳細についての説明があります。具体的な実際の実装が必要なメソッドは、次にあげるもののみです。

  • getGrantedRoles()

  • getOwnedRoles()

  • getManagedRoles()

  • isGranted()

  • isManagedBy()

  • isOwnedBy()

  • isDropRoleSupported() - 必ずfalseを返します。

  • isCreateRoleSupported() - 必ずfalseを返します。

  • isModifyRoleSupported() - 必ずfalseを返します。

残りのメソッドは、それぞれの実装で次の例外をスローする必要があります。

oracle.security.idm.OperationNotSupportedException 

25.10.3.5 oracle.security.idm.spi.AbstractUserManager

ユーザーおよびロールSPIリファレンス」には、このクラスでの実装が必要となるメソッドの詳細についての説明があります。具体的な実際の実装が必要なメソッドは、次にあげるもののみです。

  • authenticateUser(User, char[])

  • authenticateUser(String, char[])

  • isDropUserSupported() - 必ずfalseを返します。

  • isCreateUserSupported() - 必ずfalseを返します。

  • isModifyUserSupported() - 必ずfalseを返します。

残りのメソッドは、それぞれの実装で次の例外をスローする必要があります。

oracle.security.idm.OperationNotSupportedException 

25.10.3.6 oracle.security.idm.spi.AbstractRoleProfile

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 

25.10.3.7 oracle.security.idm.spi.AbstractUserProfile

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 

25.10.3.8 oracle.security.idm.spi.AbstractSimpleSearchFilter

oracle.security.idm.spi.AbstractSimpleSearchFilterは、単純な検索フィルタを実装するために拡張できる抽象クラスです。

実装クラスには、抽象クラスのコンストラクタをコールする次のようなコンストラクタが必要です。

AbstractSimpleSearchFilter (
   String attrname, int type, Object value)

ユーザーおよびロールSPIリファレンス」には、このクラスでの実装が必要となるメソッドの詳細についての説明があります。具体的な実際の実装が必要なメソッドは、次にあげるもののみです。

  • getNativeRepresentation() – 基礎となるアイデンティティ・リポジトリで使用するネイティブな表現にフィルタを変換します。

  • getWildCardChar() – 検索で使用する*などのワイルド・カード文字。具体的な文字は、基礎となるアイデンティティ・リポジトリによって異なります。

25.10.3.9 oracle.security.idm.spi.AbstractComplexSearchFilter

oracle.security.idm.spi.AbstractComplexSearchFilterは、任意の複雑性を備えた検索フィルタを実装するために拡張できる抽象クラスです。

実装クラスには、抽象クラスのコンストラクタをコールする次のようなコンストラクタが必要です。

AbstractComplexSearchFilter (
   oracle.security.idm.SearchFilter[] filters, int oper_type)

ユーザーおよびロールSPIリファレンス」には、このクラスでの実装が必要となるメソッドの詳細についての説明があります。具体的な実際の実装が必要なメソッドは、次にあげるもののみです。

  • getNativeRepresentation() – 基礎となるアイデンティティ・リポジトリで使用するネイティブな表現にフィルタを変換します。

25.10.3.10 oracle.security.idm.spi.AbstractSearchResponse

SearchResponseオブジェクトには、リポジトリから返された検索結果が格納されます。結果の各エントリは、基礎となるアイデンティティ・リポジトリにある1つのユーザーまたはロールに対応しており、対応するUserProfileクラスまたはRoleProfileクラスの実装によって表されます。

SearchResponseオブジェクトは、1つ以上の結果を返す必要があります。つまり、hasNext()メソッドは少なくとも1回はTRUEを返す必要があります。

返す結果がない場合は使用しないでください。結果が返されないと、対応する検索APIが次の例外をスローします。

oracle.security.idm.ObjectNotFoundException

25.10.4 フル機能プロバイダの開発

フル機能プロバイダでは、読取り専用プロバイダで使用できるすべての機能が実装され、さらにCRUD操作も使用できます。このため、CRUD APIをSPI実装クラスに実装する必要があります。

読取り専用プロバイダでは、OperationNotSupportedExceptionをスローするだけでこれらのAPIを実装しています(第25.10.3項「読取り専用プロバイダの開発」のクラスの説明を参照してください)。

フル機能プロバイダでは、対応するCRUD操作の具体的で実際の実装が必要になります。

25.10.5 開発のガイドライン

この項では、プロバイダ開発のためのいくつかのガイドラインを示します。

名前のマッピング

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

プロバイダの対応する実装クラスでスレッド・セーフティに関連する問題がないことを確認する必要があります。

25.10.6 テストと検証

ユーザーおよびロールAPIには、開発するプロバイダの基本操作をテストできるように、テスト・スイートが付属しています。

このテスト・スイートは、読取り専用プロバイダとフル機能プロバイダの両方のテストで使用できます。

使用方法

java oracle.security.idm.tests.SPITest propertiesfile

propertiesfileには、プロバイダ・クラス名とそのプロバイダのあらゆる構成データを格納します。また、実行するテストに関する情報も格納します。テストを実行する前に、このファイルを編集して、正しい情報で更新する必要があります。このファイルの内容は、見ればすぐわかるようになっています。このようなファイルの1つ(ffprovider.properties)を、第25.10.7.1項「サンプル・プロバイダについて」で説明しているサンプル・プロバイダで使用しています。

結果

テストによって画面に結果が表示されます。開発するすべてのプロバイダが、テスト・スイートのルックアップ・テスト、ロール・メンバーシップ・テストおよびプロファイル・テストに合格する必要があります。フル機能プロバイダは、作成と削除のテストなど、スイートにあるすべてのテストに合格する必要があります。

テスト結果のログは、現在の作業ディレクトリのresults.outファイルに出力されます。

25.10.7 例: アイデンティティ・プロバイダの実装

製品にはサンプルのアイデンティティ・プロバイダが付属しているので、それを使用してカスタム・プロバイダの作成方法を理解できます。

この項では、このサンプル・プロバイダにアクセスする方法と、カスタム・プロバイダを実装するために必要な手順について説明します。手順は、説明に使用するサンプルに依存します。

25.10.7.1 サンプル・プロバイダについて

サンプル・プロバイダは、sampleprovider.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によるテストを完了しています。これは、実際の環境で適切なテストを実行せずに本番で使用することを意図したものではありません。

25.10.7.2 実装の概要

この例で使用するサンプルのアイデンティティ・プロバイダは、アイデンティティと認証のためのカスタム・プロバイダであり、基礎となるストアとしてRDBMSを使用しています。アイデンティティ・プロバイダおよび認証プロバイダの両方として使用できます。


注意:

このサンプル・プロバイダは説明のみを目的としたものなので、十分なテストを経ずに本番で使用することはお薦めしません。


このサンプル・プロバイダを設定するには、次の手順が必要です。

  1. ユーザーおよびロールAPIを実装して、アイデンティティ・ストアとして機能するデータベース・リポジトリにアクセスします。これには、次の処理が必要です。

    1. サンプル・プロバイダの作成。その手順を知るには、ant helpを実行します。

    2. データベースへのアイデンティティ・ストア・スキーマの作成。

  2. 第25.10.7.3項「サンプル・アイデンティティ・プロバイダの使用に向けたjps-config.xmlの構成」で示しているように、サンプル・プロバイダをアイデンティティ・ストアとして構成します。

  3. 第25.10.7.4項「Oracle WebLogic Serverの構成」の説明に従って、このプロバイダをSQLAuthenticatorとして使用するようにWeblogic認証プロバイダを設定します。

25.10.7.3 サンプル・アイデンティティ・プロバイダの使用に向けたjps-config.xmlの構成

次のようにjps-config.xmlを構成して、サンプル・アイデンティティ・プロバイダをアイデンティティ・ストアとして使用できるようにします。

  1. 次のように、サービス・プロバイダ・リストに新しいプロバイダを追加します。

    <serviceProviders>
          ............
         <serviceProvider type="IDENTITY_STORE" name="custom.provider"  class="oracle.security.jps.internal.idstore.generic.GenericIdentityStoreProvider">
              <description>Custom IdStore Provider</description>
        </serviceProvider>
    </serviceProviders>
    
  2. 次のように、サービス・インスタンスを追加します。

    <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です。


  3. 次のように、デフォルトのjpsContextが、前述のステップ2で追加したアイデンティティ・ストアのサービス・インスタンスを指すようにします。

    <jpsContext name="default">
        <serviceInstanceRef ref="credstore"/>
        <serviceInstanceRef ref="keystore"/>
        <serviceInstanceRef ref="policystore.xml"/>
        <serviceInstanceRef ref="audit"/>
        <serviceInstanceRef ref="idstore.custom"/>
    </jpsContext>
    
  4. カスタム・プロバイダのjarファイルのパスをクラスパスに追加します。

  5. サーバーを再起動します。

25.10.7.4 Oracle WebLogic Serverの構成

最後のタスクとして、SQLAuthenticatorを使用するようにOracle WebLogic Serverを構成します。手順は、次のとおりです:

  1. Oracle WebLogic Serverコンソールにログインします。「セキュリティ・レルム」→「myrealm」→「プロバイダ」を選択します。「新規」をクリックして新しいプロバイダを追加します。

  2. プロバイダの名前を入力し、認証タイプとして「SQLAuthenticator」を選択します。

  3. プロバイダ」ページで、新規作成した認証プロバイダをクリックします。

  4. 「制御フラグ」をSUFFICIENTに設定します。「保存」をクリックします。

  5. リスト内のすべての認証プロバイダについて、制御フラグをsufficientに設定します。

  6. 「プロバイダ固有」タブをクリックして、認証プロバイダのサーバーの詳細を入力します。プロバイダのスキーマの作成に使用したデータソース名を入力します。「保存」をクリックします。

  7. 「プロバイダ」タブに戻り、SQLAuthenticatorがリストの最上位になるようにプロバイダの順序を並べ替えます。


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

この項では、ユーザーおよびロールSPIリファレンス(Javadoc)を示し、パッケージ名security.idm.spiを持つSPIの各抽象クラスについて説明します。抽象クラスは次のとおりです。


oracle.security.idm.spi.AbstractUserProfile

このクラスは詳細なユーザー・プロファイルです。このクラスを使用すると、ユーザー・プロファイルの属性を設定または取得できます。

コンストラクタ

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() 



oracle.security.idm.spi.AbstractUserManager

このクラスはユーザー・マネージャであり、基本的な認証メソッドを備えています。

コンストラクタ

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) 

oracle.security.idm.spi.AbstractUser

このクラスはユーザーを表します。

コンストラクタ

public AbstractUser() 

メソッド

なし


oracle.security.idm.spi.AbstractSubjectParser

この抽象クラスは、サブジェクト・パーサーのコンストラクタを提供します。

コンストラクタ

public AbstractSubjectParser() 

メソッド

なし


oracle.security.idm.spi.AbstractStoreConfiguration

この抽象クラスは、アイデンティティ・ストア構成のコンストラクタを提供します。

コンストラクタ

public AbstractStoreConfiguration() 

メソッド

なし


oracle.security.idm.spi.AbstractSimpleSearchFilter

この抽象クラスは、アイデンティティ・ストアの検索に使用できる単純な検索フィルタを表します。単純なフィルタはそれぞれ、検索属性、照合する演算子タイプおよび値で構成されます。検索結果は、この条件に基づいてフィルタ処理されます。このクラスは、基礎となる実際の表現(@link #getNativeRepresentation()メソッドで指定)が実装に固有なので、抽象クラスになっています。このメソッドの固有の実装を設定することによって、任意のサービス・プロバイダでこのクラスを拡張できます。

コンストラクタ

public AbstractSimpleSearchFilter(
   String attrname, int type, Object value) 

メソッド

表25-6は、AbstractSimpleSearchFilterのメソッドを示しています。

表25-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演算子が設定されている場合はtrue、設定されていない場合はfalseを返します。





oracle.security.idm.spi.AbstractSearchResponse

これは、検索レスポンスの結果を表す抽象クラスです。

コンストラクタ

public AbstractSearchResponse() 

メソッド

なし


oracle.security.idm.spi.AbstractRoleProfile

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

コンストラクタ

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) 

oracle.security.idm.spi.AbstractRoleManager

このクラスは、ロール・マネージャの抽象表現です。

コンストラクタ

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)

oracle.security.idm.spi.AbstractRole

このクラスは、ロールのコンストラクタを提供します。

コンストラクタ

public AbstractRole() 

メソッド

なし


oracle.security.idm.spi.AbstractIdentityStoreFactory

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


関連項目:

表25-1の「IdentityStoreFactory」


コンストラクタ

public AbstractIdentityStoreFactory() 

メソッド

public oracle.security.idm.IdentityStore getIdentityStoreInstance() 

oracle.security.idm.spi.AbstractIdentityStore

この抽象クラスは、アイデンティティ・ストアを表します。

コンストラクタ

public AbstractIdentityStore() 

メソッド

public oracle.security.idm.RoleManager getRoleManager() public oracle.security.idm.UserManager getUserManager() public java.util.List getMandatoryUserPropertyNames() public java.util.List getUserPropertySchema() 

oracle.security.idm.spi.AbstractComplexSearchFilter

このクラスは、複雑な検索フィルタを表します。このタイプの検索フィルタは、1つのブール型AND演算子またはOR演算子を使用して複数のSearchFilterインスタンスを結合する場合に使用します。構成要素となる各検索フィルタ自体に複雑なフィルタを使用できるので、複雑性の高いネストした検索フィルタの作成が可能です。

このクラスは、基礎となる実際の表現(@link #getNativeRepresentation()メソッドで指定)が実装に固有なので、抽象クラスになっています。

このメソッドの固有の実装を作成することによって、任意のサービス・プロバイダでこのクラスを拡張できます。

コンストラクタ

public AbstractComplexSearchFilter(       SearchFilter[] filters,   int oper_type) 

メソッド

表25-7 複雑な検索フィルタのメソッド

メソッド 説明

public void addFilterComponent( SearchFilter filter)

この複雑なフィルタのリストに、構成要素であるSearchFilterを追加します。

public void setNegate()

検索フィルタの現在のNOT状態を否定します。切替えスイッチのように動作します。

public void negate()

検索フィルタの現在のNOT状態を否定します。切替えスイッチのように動作します。

public boolean isNegated()

検索フィルタの現在のNOT状態を返します。NOT演算子が設定されている場合はtrue、設定されていない場合はfalseを返します。

public int getOperatorType()

複数のSearchFilterを結合する論理演算子タイプ。