プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Platform Security Servicesによるアプリケーションの保護
12c (12.2.1)
E72537-01
  目次へ移動
目次

前
 
次
 

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

この章では、ユーザーおよびロールAPIを使用してアイデンティティ・ストアのエントリにアクセス、検索および変更する方法と、LDAPプロバイダを使用してSecure Sockets Layer (SSL)を構成する方法について説明します。

次の項が含まれます:

19.1 ユーザーおよびロールAPIについて


注意:

ユーザーおよびロールAPIは非推奨です。かわりにIdentity Governance Frameworkを使用し、このフレームワークの使用に移行することをお薦めします。この移行の詳細は、『Identity Governance Framework開発者ガイド』の「アイデンティティ・ディレクトリAPIへの移行」を参照してください。

ユーザーおよびロールAPIを使用すると、アプリケーションでは、基礎となるアイデンティティ・リポジトリの種類を問わず、統一的で移植可能な方法でアイデンティティ情報にアクセスできます。このリポジトリとして、LDAPサーバー、データベース、ファイル、一部のカスタム・リポジトリを使用できます。

ユーザーおよびロールAPIでは、プログラムによってリポジトリにアクセスでき、移植性を確保するため、アプリケーションの簡略化に役立ちます。たとえば、このAPIを使用すると、アプリケーションでは、アプリケーション・コードを変更する必要なしにいくつかのリポジトリにアクセスできます。

このAPIには、ユーザーおよびロールを作成、更新、削除したり、属性を検索するためのメソッドが組み込まれているため、たとえば、特定のロールの全ユーザーの電子メール・アドレスを取得することが可能です。

JavaコンテナからユーザーおよびロールAPIを使用するには、アイデンティティ・ストアはLDAPであり、管理サーバーは稼働している必要があります。さらに、アプリケーション・ロール・メンバーではweblogic.security.principal.WLSUserImplクラスを使用する必要があります。

ユーザーの認証には認証プロバイダを使用し、ユーザーおよびロールAPIをその目的で使用しないことと、ユーザーおよびロールAPIと同じLDAPサーバーのエントリにアクセスする他のAPIを同時に使用しないことをお薦めします。


関連項目:

「認証プロバイダとユーザーおよびロールAPI」

Oracle WebLogic Serverのセキュリティ・プロバイダの開発

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


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

デフォルトでは、ユーザーおよびロールAPIはドメインで構成されている最初の認証プロバイダを使用します。アプリケーションで他の構成済認証プロバイダを使用する必要がある場合は、「サービス・プロバイダの操作」の説明に従ってこの特別な使用を構成します。

環境で複数のプロバイダが構成されている場合、プロバイダを順序リストに指定し、それぞれに制御フラグを設定します。この順序と制御フラグを使用して、サーバーでは使用するプロバイダが判別されます。プロバイダが1つ選択されると、残りのプロバイダは無視されます。

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

プロバイダを実装するには、次の各項での説明に従って、基礎となるリポジトリに適したプロバイダ・クラスを選択し、そのプロバイダを構成してからプロバイダ・ランタイムを構成します。


関連項目:

『Oracle WebLogic Serverセキュリティ・プロバイダの開発』の「アイデンティティ・アサーション・プロバイダ」


19.2.1 環境の設定

ユーザーおよびロールAPIでは、基礎となるリポジトリとの実際の通信を実行するアイデンティティ・プロバイダを介して、アイデンティティ・リポジトリとやり取りします。これにより、プロバイダの接続情報を変更することで様々なリポジトリで同じコードを使用できるため、柔軟性が得られます。

ユーザーおよびロールAPIを使用するように環境を構成するには、次のようにします。

  • 基礎となる特定のアイデンティティ・リポジトリを実装するプロバイダJARファイルとプロバイダで必要なコンポーネントJARが環境で使用できることを確認します。

  • 検索メソッドで使用されるオブジェクト・クラスを指定します。

         <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>
    
  • LDAPプロバイダの場合、cn=common,cn=products,cn=oraclecontextノードを読み取るためのパーミッションを保持するようにプロバイダ・ユーザーを構成します。

19.2.2 プロバイダ・リポジトリの選択

OPSSでは、アイデンティティ・サービス・プロバイダに対して数多くのユーザー・リポジトリをサポートしています。システムおよびバージョンについては、http://www.oracle.com/technetwork/middleware/ias/downloads/fusion-certification-100350.htmlで「Oracle Fusion Middleware 12c Certifications」を参照してください。

リポジトリを選択すると、次の表で説明しているように、プロバイダとともに使用するプロバイダ・クラスが決まります。

表19-1 リポジトリとプロバイダ・クラス

リポジトリ プロバイダ・クラス

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

組込み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


プロバイダ・クラスには、ユーザーおよびロールAPIフレームワークで指定されているインタフェースを実装する必要があります。このAPIの詳細は、Oracle Fusion Middleware Oracle Platform Security Services用のJava APIリファレンスを参照してください。

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

プロバイダのクラスを特定した後にプロバイダ・インスタンスを作成するには、次の手順を実行します。

  1. IdentityStoreFactoryBuilder.getIdentityStoreFactoryメソッドを使用して、ファクトリ・インスタンスを作成します。

    IdentityStoreFactoryBuilder builder =new IdentityStoreFactoryBuilder ();
       
    
  2. IdentityStoreFactory.getIdentityStoreInstanceメソッドを使用して、ストア・インスタンスを作成します。

    IdentityStoreFactory oidFactory = builder.getIdentityStoreFactory(
       ”oracle.security.idm.providers.oid.OIDIdentityStoreFactory", factEnv); 
    
  3. アイデンティティ・ストアへのハンドルを取得します。

    oidStore = oidFactory.getIdentityStoreInstance(storeEnv);
    

19.2.4 プロバイダの起動時および実行時のプロパティの構成

URL、リポジトリ・ポート番号、リポジトリにアクセスするためのユーザーおよびパスワードなど、ファクトリ・インスタンスおよびストア・インスタンスについて数多くのプロパティを設定できます。

次の各項では、これらのプロパティの設定方法について説明します。

19.2.4.1 起動時と実行時の構成

起動時(プロバイダの作成時)または実行時にプロバイダ・プロパティを構成するには、次のようなプロパティを使用します。

  • 起動時のプロパティ: 名前には接頭辞ST_が付いています。

  • 実行時のプロパティ: 名前には接頭辞RT_が付いています。

起動時の構成プロパティ

通常、起動時のプロバイダ・プロパティの値はプロバイダの存続期間にわたって永続するため、このようなプロパティの構成は1回です。

ストア・インスタンスを作成する場合はST_SUBSCRIBER_NAMEプロパティを指定し、プロバイダ・ファクトリ・インスタンスを作成する場合は他の起動時のプロパティをすべて指定します。

次の表では、起動時のアイデンティティ・プロバイダ・プロパティについて説明します。

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

プロパティ名 説明

ST_BINARY_ATTRIBUTES

LDAPサーバーに格納されているバイナリ属性の名前。プロバイダでは、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サーバーでのベース識別名。このプロパティは、IdentityStoreインスタンスの作成時に指定され、残りのプロパティのデフォルト値を決定するために使用されます。

ST_CONNECTION_POOL_CLASS

接続プールの完全修飾クラス名。

ST_INITIAL_CONTEXT_FACTORY

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


実行時の構成プロパティ

実行時のプロパティは、プロバイダのIdentityStoreインスタンスの動作を制御します。これらのプロパティは、IdentityStoreインスタンスから取得されるStoreConfigurationオブジェクトを指定して構成します。すべての実行時のプロパティには、デフォルト値があります。

次の表では、実行時のアイデンティティ・プロバイダ・プロパティについて説明します。

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

プロパティ名 説明

RT_USER_OBJECT_CLASSES

ユーザーの作成に必要なクラスの配列。

RT_USER_MANDATORY_ATTRS

新しいユーザーの必須属性。

RT_USER_CREATE_BASES

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

RT_USER_SEARCH_BASES

ユーザーの検索が可能なベースDN。

RT_USER_FILTER_OBJECT_CLASSES

ユーザーの検索に使用するクラスの配列。

RT_GROUP_OBJECT_CLASSES

ロールの作成に必要なクラスの配列。

RT_GROUP_MANDATORY_ATTRS

新しいロールの必須属性。

RT_GROUP_CREATE_BASES

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

RT_GROUP_SEARCH_BASES

ロールの検索が可能なベースDN。

RT_GROUP_MEMBER_ATTRS

ロールの属性の配列。ロールのメンバーはすべて、これらの属性それぞれについて値を持っています。

RT_GROUP_FILTER_OBJECT_CLASSES

ロールの検索に使用するクラスの配列。

RT_USER_SELECTED_CREATE_BASE

createUserを使用してユーザーが作成される識別名。nullで、ST_SUBSCRIBER_NAMEが指定されていない場合は、最初に指定されたRT_USER_CREATE_BASEの値が使用されます。nullで、ST_SUBSCRIBER_NAMEが指定されている場合は、アイデンティティ・ストアのサブスクライバ名が使用されます。

RT_GROUP_SELECTED_CREATE_BASE

createRoleを使用してロールが作成される識別名。nullで、ST_SUBSCRIBER_NAMEが指定されていない場合は、最初に指定されたRT_GROUP_CREATE_BASEの値が使用されます。nullで、ST_SUBSCRIBER_NAMEが指定されている場合は、アイデンティティ・ストアのサブスクライバ名が使用されます。

RT_GROUP_GENERIC_SEARCH_BASE

特定のアイデンティティでロールを検索する識別名。LDAPプロバイダでは、デフォルトでサブスクライバ名に設定されますが、それ以外の場合は最初のグループ検索ベースに設定されます。

RT_SEARCH_TYPE

検索のタイプ: SIMPLE、PAGEDまたはVIRTUAL_LIST_VIEW。


19.2.4.2 実行コンテキストIDの有効化

ECIDの有効化は、LDAPアイデンティティ・ストアでのみ必要です。ユーザーおよびロールAPIでは、デフォルトでECIDのサポートが無効になっています。有効にするには、APIを初期化する際にST_ECID_ENABLEDプロパティをtrueに設定します。

factEnv.put(OVDIdentityStoreFactory.ST_ECID_ENABLED, "true");

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

この段階での構成は、ファクトリ・オブジェクト全体の他、特定のファクトリ・インスタンスを使用して作成されるオブジェクトにも影響を与えます。ST_LDAP_URL、ST_SECURITY_PRINCIPALST_SECURITY_CREDENTIALなど、起動時のプロパティの多くはこの時点で設定されます。

次の各項では、ファクトリ・インスタンスの作成時にプロバイダ・プロパティを構成する方法について説明します。

19.2.5.1 共通プロパティの構成

次の例では、ログの場所の指定を含め、LDAPファクトリの作成時点でのプロバイダ構成を示します。

IdentityStoreFactoryBuilder builder = new IdentityStoreFactoryBuilder();
IdentityStoreFactory oidFactory = null;
Hashtable factEnv = new Hashtable();
Logger mylogr = Logger.getLogger("mylogger.abc.com");
FileHandler fh = new FileHandler("userroleapi.log");
mylogr.addHandler(fh);
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/");
factEnv.put(OIDIdentityStoreFactory.ST_LOGGER_NAME, "mylogger.abc.com");
oidFactory = builder.getIdentityStoreFactory(
   "oracle.security.idm.providers.oid.OIDIdentityStoreFactory", factEnv);

19.2.5.2 定数、接続数およびプール接続の構成

定数およびデフォルトのプロパティ値を上書きするには、ファクトリの作成時にST_PROPERTY_ATTRIBUTE_MAPPINGにマップを指定します。

次の例では、接続の最大数と最小数、カスタム接続プール・クラス、RoleProfile.OWNERユーザーからmyowner属性へのマップを設定する方法を示します。

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

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

getOwnersgetOwnedRolesなど、所有者に関連する操作はすべて、myowner属性を使用して実行されます。接続の最大値から最小値を差し引いた値は10を上回る必要があります。

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

アイデンティティ・ストアの構成は、ストアとストア・インスタンスで作成されたすべてのオブジェクトに適用されるため、アイデンティティ・ストア・インスタンスの作成時に、必要な実行時のプロパティを指定します。

次の例では、ストア・インスタンスを作成する方法と、そのハンドルを取得する方法を示します。

IdentityStore oidStore = null;
Hashtable storeEnv = new Hashtable();
storeEnv.put(OIDIdentityStoreFactory.ST_SUBSCRIBER_NAME,"dc=us,dc=oracle,dc=com");
oidStore = oidFactory.getIdentityStoreInstance(storeEnv);

19.2.7 実行時のプロバイダの構成

実行時のプロパティの追加および変更を容易にするために、ユーザーおよびロールAPIにはgetStoreConfigurationメソッドが用意されています。たとえば、実行時にRT_USER_SEARCH_BASESを設定するには、次のようにします。

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

19.2.8 プログラミングのガイドライン

次の各項では、プロバイダおよびプロバイダ・アーティファクトを操作する際に考慮する推奨事項を示します。

19.2.8.1 プロバイダの切替え

プロバイダを切り替えた後にアプリケーションが確実に機能するように、次のガイドラインを考慮してください。

  1. ユーザー・プロパティを参照する場合にのみ、oracle.security.idm.UserProfileで指定した定数を使用します。移植不可能なネイティブの定数は使用しないでください。たとえば、ユーザーのログイン名を取得する必要がある場合は、UserProfile.USER_NAME定数を使用してフェッチします。

    Property prop = usrprofile.getProperty(UserProfile.USER_NAME);
    
  2. 次のようなコードを使用して、ユーザーのプロパティをすべて取得します。

    UserProfile upf = null;
    List proplst = store.getUserPropertyNames();
    String[] proparr = (String[]) proplst.toArray(new String[proplst.size()]);
    PropertySet pset = upf.getProperties(proparr);
    
  3. 検索フィルタを作成する際、検索フィルタ文字列でネイティブのワイルド・カード文字を直接使用しないでください。かわりに、プロバイダに対して正しいワイルドカード文字をフェッチするSimpleSearchFilter.getWildCardCharメソッドを使用します。

    SmpleSearchFilter sf = m_identityStore.getSimpleSearchFilter(
       attrName, SimpleSearchFilter.TYPE_EQUAL, null); 
    sf.setValue(filterStringWithoutWildcard+sf.getWildCardChar());
    

    たとえば、このメソッドは、データベース・プロバイダの場合は%を返し、LDAPプロバイダの場合は*を返します。

  4. アプリケーションが事前定義済のワイルドカード文字を含むユーザー指定のフィルタ文字列を受け入れる場合は、ユーザーおよびロールAPIのフィルタを生成する間に、フィルタに次の変換を適用します。

    //User supplied filter 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);
    

19.2.8.2 アイデンティティ・ストア・オブジェクトの使用

アプリケーションの実装時には、次の点を考慮します。

  • アイデンティティ・ストアの実装は、スレッドセーフではありません。ユーザーおよびロールAPIでは、ストア・インスタンスはスレッド間で共有されないことを前提としています。ストア・インスタンスがスレッド間で共有される場合、アプリケーション・コードでは、避けられないスレッド・セーフティの問題に注意して対処する必要があります。

  • 一部のアプリケーションでは、実行時のプロパティとして定義する作成ベース、検索ベース、その他の様々な実行時のプロパティをユーザー・セッションで変更できるため、このような設定に応じてアイデンティティ・ストアの実行時の動作が変ります。フレームワークでは、セッションごとに使用できるアイデンティティ・ストア・インスタンスは1つのみです。

19.2.9 プロバイダの存続期間

プロバイダは、ファクトリ・インスタンスを閉じるまで環境に存在し続けます。プロバイダ・インスタンスが終了すると、そのインスタンスで作成されたオブジェクトはすべて無効になり、そのようなオブジェクトに対するその後のコールは例外をスローします。ファクトリ・インスタンスを閉じる際は、サーバー接続を明示的に閉じて、有効でなくなったインスタンスを削除することをお薦めします。ファクトリ・インスタンスはスレッドセーフですが、アイデンティティ・ストア・インスタンスはスレッドセーフではありません。

アイデンティティ・ストア・インスタンスを閉じる場合にも、同様の考慮事項が当てはまります。

19.3 アイデンティティ・ストアの検索

アイデンティティ・ストアへの問合せでは、単一のアイデンティティを返すことも、複数のアイデンティティを返すこともできます。次の各項では、ユーザーおよびロールAPIを使用してアイデンティティ・ストアに問い合せる方法について説明します。

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

特定のアイデンティティまたはロールを問い合せるには、次のメソッドのいずれかを使用します。

IdentityStore.searchUser(String name);
IdentityStore.searchUser(Principal principal);
IdentityStore.searchUser(int searchType, String name); 
IdentityStore.searchRole(int searchType, String value);

これらのメソッドは、ストアに格納されていることがわかっているアイデンティティへのオブジェクト参照を取得する必要がある場合に使用します。ストアで同じ値を持つエンティティが複数見つかると例外が発生します。

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

複数のアイデンティティまたはロールを問い合せるには、次のメソッドのいずれかを使用します。

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

19.3.3 検索フィルタの使用

ユーザーおよびロールAPIには、様々な検索操作を容易にする検索フィルタが多数含まれています。次の各項では、検索フィルタの使用方法について説明します。

19.3.3.1 フィルタ演算子

ユーザーおよびロールAPIでは、簡易検索フィルタの作成に使用する演算子"="、"<"、">"、"<="および">="と、2つ以上の検索文字列を組み合せた複合検索フィルタの作成に使用する演算子"&"および"|"がサポートされています。

NOT演算子は、簡易検索フィルタでも複合検索フィルタでも使用します。否定フィルタは、フィルタによって拒否されたエンティティを返します。

19.3.3.2 ログイン・ユーザーおよびロール用のフィルタ

アプリケーションでは一般に、ログイン・ユーザーのアイデンティティおよびユーザーのグループ名を取得する必要があります。user.login.attr属性とgroupname.attr属性はユーザーのログイン時に設定されるため、UserProfile.getUserNameメソッドとRoleProfile.getProperty(RoleProfile.NAME)メソッドを使用して、これらの値を取得します。

次の例では、ログイン・ユーザーを問い合せる方法を示します。

SimpleSearchFilter sf = oidStore.getSimpleSearchFilter(
      UserProfile.USER_NAME,  SimpleSearchFilter.TYPE_EQUAL, "sampleUserName");
   SearchParameters ssp = new SearchParameters(sf, SearchParameters.SEARCH_USERS_ONLY);
 
   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 );
   }

次の例では、ログイン・ユーザーのロールを問い合せる方法を示します。

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

19.3.3.3 フィルタの例

簡易検索フィルタの実装は、基礎となるストアによって異なります。次の例では、NAMEフィールドの値がnull以外であるエントリがすべてフィルタを通ります。

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

次の例では、優先言語が英語以外のユーザーが取得されます。

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

次の例では、複数の検索フィルタを演算子の"&"または"|"で結合しています。これは、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); 

否定フィルタを使用して、"a"から"j"までの文字で始まり、文字"i"で始まらない名前を持つユーザーを検索するには、次のようにします。

[continues from previous example]
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); 

次の例では、文字の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);
 
// Search users
SearchResponse resp = oidStore.searchUsers(params);
System.out.println("Searched users are:");
while (resp.hasNext()) {
   Identity idy = resp.next();
   System.out.println("Unique name: "+idy.getUniqueName());
}

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

ユーザーおよびロールAPIを使用すると、UserManagerクラスとRoleManagerクラスを使用してアイデンティティを追加および変更できます。UserManagerおよびRoleManagerのインスタンスをストア・インスタンスから取得するには、次のコールを使用します。

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

次の各項では、それぞれの例を示します。


関連項目:

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


19.4.1 アイデンティティとロールの作成

新しいアイデンティティを作成するには、UserManagerクラスで次のメソッドのいずれかを使用します。

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

2つ目のメソッドにより、渡された値がユーザー・プロパティに設定されます。必須属性の値が入力されないと、デフォルト値が指定されます。

新しいロールを作成するには、RoleManagerクラスで次のメソッドのいずれかを使用します。

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

デフォルトでは、ロールはエンタープライズ・スコープで作成されます。

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

アイデンティティを変更するには、まずそのアイデンティティへの参照を取得します。次に、UserUserProfileRoleまたはRoleProfileの各クラスでsetPropertyメソッドを使用してアイデンティティを変更します。

表示名を置換するには、次のようにします。

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

有効な演算子は、ADDREMOVEおよびREPLACEです。

複数の値を持つ属性の値の1つを変更するには、まず変更する値を削除し、次に変更した値を追加します。

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

アイデンティティを削除するには、まずユーザーおよびロールの参照を取得し、次にdropUserメソッドとdropRoleメソッドを使用します。

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

19.5 ユーザーおよびロールAPIの例

次の各例では、ユーザーおよびロールAPIを使用してユーザーを問い合せたり、管理する方法を示します。

19.5.1 ユーザーの検索の例

次の例では、ユーザーを問い合せるための検索フィルタの設定方法を示します。グループを問い合せるには、RoleProfileクラスを使用します。ユーザーを問い合せるには、UserProfileクラスを使用します。

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

19.5.2 ユーザーの管理の例

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");
 
      // create the factory
      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);
 
      // create the store
      storeEnv.put(ADIdentityStoreFactory.ST_SUBSCRIBER_NAME, 
                   "dc=upad,dc=us,dc=oracle,dc=com");
      adStore = adFactory.getIdentityStoreInstance(storeEnv);
 
      //get UserManager and create user
      UserManager usrmanager = adStore.getUserManager();
      String usrname = "amyd";
      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() );
 
      // modify user
      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("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 succeded");
      else
        System.out.println("password verification failed");
 
      SimpleSearchFilter sf = adStore.getSimpleSearchFilter(
                    UserProfile.NAME, SimpleSearchFilter.TYPE_EQUAL, usrname);
      
      SearchParameters params = new SearchParameters();
      params.setFilter(sf);
 
      // Search 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());
      }
 
      // delete user
      System.out.println("deleting user "+usrname);
      usrmanager.dropUser(usr);
      System.out.println("user dropped");
    }catch (Exception e)
    {
      e.printStackTrace();
    }
  }
}

19.6 LDAPプロバイダ用のSSLの構成

次の各項では、プロバイダへのSSL接続に関するUserおよびロールAPIのサポートについて説明します。

19.6.1 プロバイダに対するSSLの設定

ユーザーおよびロールAPIのLDAPプロバイダでは、LDAPアイデンティティ・ストアとのSSLを実現するために、Java Secure Sockets Extension (JSSE)に依存しています。

すぐに使用できるSSLを設定するには、次の手順を実行します。

  1. キーストアおよびキー・パスワードの値を指定し、システム・プロパティを設定します。

    String keystore = "<keystore location>";
    String keypasswd = "<keystore password>";
    System.setProperty("javax.net.ssl.trustStore",keystore);
    System.setProperty("javax.net.ssl.trustStorePassword", keypasswd);
    
  2. LDAPサーバーのSSL URLを設定します。

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

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

19.6.2 プロバイダに対するSSLのカスタマイズ

SSLをカスタマイズするには、次の手順を実行します。

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