Oracle® Fusion Middleware Oracle Platform Security Servicesによるアプリケーションの保護 12c (12.2.1.2.0) E82689-01 |
|
![]() 前 |
![]() 次 |
この章では、ユーザーおよびロールAPIを使用してアイデンティティ・ストアのエントリにアクセス、検索および変更する方法と、LDAPプロバイダを使用してSecure Sockets Layer (SSL)を構成する方法について説明します。
次の項が含まれます:
注意: ユーザーおよびロールAPIは非推奨です。かわりにIdentity Governance Frameworkを使用し、このフレームワークの使用に移行することをお薦めします。この移行の詳細は、『Identity Governance Frameworkによるアプリケーションの開発』のアイデンティティ・ディレクトリAPIへの移行に関する項を参照してください。 |
ユーザーおよびロールAPIを使用すると、アプリケーションでは、基礎となるアイデンティティ・リポジトリの種類を問わず、統一的で移植可能な方法でアイデンティティ情報にアクセスできます。このリポジトリとして、LDAPサーバー、データベース、ファイル、一部のカスタム・リポジトリを使用できます。
ユーザーおよびロールAPIでは、プログラムによってリポジトリにアクセスでき、移植性を確保するため、アプリケーションの簡略化に役立ちます。たとえば、このAPIを使用すると、アプリケーションでは、アプリケーション・コードを変更する必要なしにいくつかのリポジトリにアクセスできます。
このAPIには、ユーザーおよびロールを作成、更新、削除したり、属性を検索するためのメソッドが組み込まれているため、たとえば、特定のロールの全ユーザーの電子メール・アドレスを取得することが可能です。
JavaコンテナからユーザーおよびロールAPIを使用するには、アイデンティティ・ストアはLDAPであり、管理サーバーは稼働している必要があります。さらに、アプリケーション・ロール・メンバーではweblogic.security.principal.WLSUserImpl
クラスを使用する必要があります。
ユーザーの認証には認証プロバイダを使用し、ユーザーおよびロールAPIをその目的で使用しないことと、ユーザーおよびロールAPIと同じLDAPサーバーのエントリにアクセスする他のAPIを同時に使用しないことをお薦めします。
関連項目: Oracle WebLogic Serverのセキュリティ・プロバイダの開発 Oracle Platform Security ServicesのユーザーおよびロールのJava APIリファレンス |
デフォルトでは、ユーザーおよびロールAPIはドメインで構成されている最初の認証プロバイダを使用します。アプリケーションで他の構成済認証プロバイダを使用する必要がある場合は、「サービス・プロバイダの操作」の説明に従ってこの特別な使用を構成します。
環境で複数のプロバイダが構成されている場合、プロバイダを順序リストに指定し、それぞれに制御フラグを設定します。この順序と制御フラグを使用して、サーバーでは使用するプロバイダが判別されます。プロバイダが1つ選択されると、残りのプロバイダは無視されます。
プロバイダを実装するには、次の各項での説明に従って、基礎となるリポジトリに適したプロバイダ・クラスを選択し、そのプロバイダを構成してからプロバイダ・ランタイムを構成します。
関連項目: 『Oracle WebLogic Serverセキュリティ・プロバイダの開発』のアイデンティティ・アサーション・プロバイダに関する項 |
ユーザーおよびロール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
ノードを読み取るためのパーミッションを保持するようにプロバイダ・ユーザーを構成します。
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 Platform Security Services用のJava APIリファレンスを参照してください。
プロバイダのクラスを特定した後にプロバイダ・インスタンスを作成するには、次の手順を実行します。
IdentityStoreFactoryBuilder.getIdentityStoreFactory
メソッドを使用して、ファクトリ・インスタンスを作成します。
IdentityStoreFactoryBuilder builder =new IdentityStoreFactoryBuilder ();
IdentityStoreFactory.getIdentityStoreInstance
メソッドを使用して、ストア・インスタンスを作成します。
IdentityStoreFactory oidFactory = builder.getIdentityStoreFactory( ”oracle.security.idm.providers.oid.OIDIdentityStoreFactory", factEnv);
アイデンティティ・ストアへのハンドルを取得します。
oidStore = oidFactory.getIdentityStoreInstance(storeEnv);
URL、リポジトリ・ポート番号、リポジトリにアクセスするためのユーザーおよびパスワードなど、ファクトリ・インスタンスおよびストア・インスタンスについて数多くのプロパティを設定できます。
次の各項では、これらのプロパティの設定方法について説明します。
起動時(プロバイダの作成時)または実行時にプロバイダ・プロパティを構成するには、次のようなプロパティを使用します。
起動時のプロパティ: 名前には接頭辞ST_が付いています。
実行時のプロパティ: 名前には接頭辞RT_が付いています。
起動時の構成プロパティ
通常、起動時のプロバイダ・プロパティの値はプロバイダの存続期間にわたって永続するため、このようなプロパティの構成は1回です。
ストア・インスタンスを作成する場合はST_SUBSCRIBER_NAMEプロパティを指定し、プロバイダ・ファクトリ・インスタンスを作成する場合は他の起動時のプロパティをすべて指定します。
次の表では、起動時のアイデンティティ・プロバイダ・プロパティについて説明します。
表19-2 起動時のアイデンティティ・プロバイダ・プロパティ
プロパティ名 | 説明 |
---|---|
ST_BINARY_ATTRIBUTES |
LDAPサーバーに格納されているバイナリ属性の名前。プロバイダでは、LDAPサーバーとのデータの送受信時に、このような属性をバイナリ・データとして処理します。 |
ST_CONNECTION_POOL |
|
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 |
|
RT_GROUP_SELECTED_CREATE_BASE |
|
RT_GROUP_GENERIC_SEARCH_BASE |
特定のアイデンティティでロールを検索する識別名。LDAPプロバイダでは、デフォルトでサブスクライバ名に設定されますが、それ以外の場合は最初のグループ検索ベースに設定されます。 |
RT_SEARCH_TYPE |
検索のタイプ: SIMPLE、PAGEDまたはVIRTUAL_LIST_VIEW。 |
ECIDの有効化は、LDAPアイデンティティ・ストアでのみ必要です。ユーザーおよびロールAPIでは、デフォルトでECIDのサポートが無効になっています。有効にするには、APIを初期化する際にST_ECID_ENABLED
プロパティをtrue
に設定します。
factEnv.put(OVDIdentityStoreFactory.ST_ECID_ENABLED, "true");
この段階での構成は、ファクトリ・オブジェクト全体の他、特定のファクトリ・インスタンスを使用して作成されるオブジェクトにも影響を与えます。ST_LDAP_URL、ST_SECURITY_PRINCIPAL
、ST_SECURITY_CREDENTIAL
など、起動時のプロパティの多くはこの時点で設定されます。
次の各項では、ファクトリ・インスタンスの作成時にプロバイダ・プロパティを構成する方法について説明します。
次の例では、ログの場所の指定を含め、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);
定数およびデフォルトのプロパティ値を上書きするには、ファクトリの作成時に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);
getOwners
やgetOwnedRoles
など、所有者に関連する操作はすべて、myowner
属性を使用して実行されます。接続の最大値から最小値を差し引いた値は10を上回る必要があります。
アイデンティティ・ストアの構成は、ストアとストア・インスタンスで作成されたすべてのオブジェクトに適用されるため、アイデンティティ・ストア・インスタンスの作成時に、必要な実行時のプロパティを指定します。
次の例では、ストア・インスタンスを作成する方法と、そのハンドルを取得する方法を示します。
IdentityStore oidStore = null; Hashtable storeEnv = new Hashtable(); storeEnv.put(OIDIdentityStoreFactory.ST_SUBSCRIBER_NAME,"dc=us,dc=oracle,dc=com"); oidStore = oidFactory.getIdentityStoreInstance(storeEnv);
実行時のプロパティの追加および変更を容易にするために、ユーザーおよびロールAPIにはgetStoreConfiguration
メソッドが用意されています。たとえば、実行時にRT_USER_SEARCH_BASES
を設定するには、次のようにします。
StoreConfiguration conf = oidStore.getStoreConfiguration(); conf.setProperty(”RT_USER_SEARCH_BASES”, ”dc=us,dc=oracle,dc=com”);
次の各項では、プロバイダおよびプロバイダ・アーティファクトを操作する際に考慮する推奨事項を示します。
プロバイダを切り替えた後にアプリケーションが確実に機能するように、次のガイドラインを考慮してください。
ユーザー・プロパティを参照する場合にのみ、oracle.security.idm.UserProfile
で指定した定数を使用します。移植不可能なネイティブの定数は使用しないでください。たとえば、ユーザーのログイン名を取得する必要がある場合は、UserProfile.USER_NAME
定数を使用してフェッチします。
Property prop = usrprofile.getProperty(UserProfile.USER_NAME);
次のようなコードを使用して、ユーザーのプロパティをすべて取得します。
UserProfile upf = null; List proplst = store.getUserPropertyNames(); String[] proparr = (String[]) proplst.toArray(new String[proplst.size()]); PropertySet pset = upf.getProperties(proparr);
検索フィルタを作成する際、検索フィルタ文字列でネイティブのワイルド・カード文字を直接使用しないでください。かわりに、プロバイダに対して正しいワイルドカード文字をフェッチするSimpleSearchFilter.getWildCardChar
メソッドを使用します。
SmpleSearchFilter sf = m_identityStore.getSimpleSearchFilter( attrName, SimpleSearchFilter.TYPE_EQUAL, null); sf.setValue(filterStringWithoutWildcard+sf.getWildCardChar());
たとえば、このメソッドは、データベース・プロバイダの場合は%
を返し、LDAPプロバイダの場合は*
を返します。
アプリケーションが事前定義済のワイルドカード文字を含むユーザー指定のフィルタ文字列を受け入れる場合は、ユーザーおよびロール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);
アプリケーションの実装時には、次の点を考慮します。
アイデンティティ・ストアの実装は、スレッドセーフではありません。ユーザーおよびロールAPIでは、ストア・インスタンスはスレッド間で共有されないことを前提としています。ストア・インスタンスがスレッド間で共有される場合、アプリケーション・コードでは、避けられないスレッド・セーフティの問題に注意して対処する必要があります。
一部のアプリケーションでは、実行時のプロパティとして定義する作成ベース、検索ベース、その他の様々な実行時のプロパティをユーザー・セッションで変更できるため、このような設定に応じてアイデンティティ・ストアの実行時の動作が変ります。フレームワークでは、セッションごとに使用できるアイデンティティ・ストア・インスタンスは1つのみです。
プロバイダは、ファクトリ・インスタンスを閉じるまで環境に存在し続けます。プロバイダ・インスタンスが終了すると、そのインスタンスで作成されたオブジェクトはすべて無効になり、そのようなオブジェクトに対するその後のコールは例外をスローします。ファクトリ・インスタンスを閉じる際は、サーバー接続を明示的に閉じて、有効でなくなったインスタンスを削除することをお薦めします。ファクトリ・インスタンスはスレッドセーフですが、アイデンティティ・ストア・インスタンスはスレッドセーフではありません。
アイデンティティ・ストア・インスタンスを閉じる場合にも、同様の考慮事項が当てはまります。
アイデンティティ・ストアへの問合せでは、単一のアイデンティティを返すことも、複数のアイデンティティを返すこともできます。次の各項では、ユーザーおよびロールAPIを使用してアイデンティティ・ストアに問い合せる方法について説明します。
特定のアイデンティティまたはロールを問い合せるには、次のメソッドのいずれかを使用します。
IdentityStore.searchUser(String name); IdentityStore.searchUser(Principal principal); IdentityStore.searchUser(int searchType, String name); IdentityStore.searchRole(int searchType, String value);
これらのメソッドは、ストアに格納されていることがわかっているアイデンティティへのオブジェクト参照を取得する必要がある場合に使用します。ストアで同じ値を持つエンティティが複数見つかると例外が発生します。
複数のアイデンティティまたはロールを問い合せるには、次のメソッドのいずれかを使用します。
IdentityStore.search(SearchParams params); IdentityStore.searchUsers(SearchParams params); IdentityStore.searchRoles(int searchType, SearchParams params); IdentityStore.searchProfiles(SearchParams params);
ユーザーおよびロールAPIには、様々な検索操作を容易にする検索フィルタが多数含まれています。次の各項では、検索フィルタの使用方法について説明します。
ユーザーおよびロールAPIでは、簡易検索フィルタの作成に使用する演算子"="、"<"、">"、"<="および">="と、2つ以上の検索文字列を組み合せた複合検索フィルタの作成に使用する演算子"&"および"|"がサポートされています。
NOT
演算子は、簡易検索フィルタでも複合検索フィルタでも使用します。否定フィルタは、フィルタによって拒否されたエンティティを返します。
アプリケーションでは一般に、ログイン・ユーザーのアイデンティティおよびユーザーのグループ名を取得する必要があります。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 ); }
簡易検索フィルタの実装は、基礎となるストアによって異なります。次の例では、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()); }
ユーザーおよびロールAPIを使用すると、UserManager
クラスとRoleManager
クラスを使用してアイデンティティを追加および変更できます。UserManager
およびRoleManager
のインスタンスをストア・インスタンスから取得するには、次のコールを使用します。
UserManager um = storeInst.getUserManager(); RoleManager rm = storeInst.getRoleManager();
次の各項では、それぞれの例を示します。
新しいアイデンティティを作成するには、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);
デフォルトでは、ロールはエンタープライズ・スコープで作成されます。
アイデンティティを変更するには、まずそのアイデンティティへの参照を取得します。次に、User
、UserProfile
、Role
またはRoleProfile
の各クラスでsetProperty
メソッドを使用してアイデンティティを変更します。
表示名を置換するには、次のようにします。
UserProfile usrprofile = usr.getUserProfile(); ModProperty mprop = new ModProperty(UserProfile.DISPLAY_NAME, "modified display name", ModProperty.REPLACE); usrprofile.setProperty(mprop);
有効な演算子は、ADD
、REMOVE
およびREPLACE
です。
複数の値を持つ属性の値の1つを変更するには、まず変更する値を削除し、次に変更した値を追加します。
アイデンティティを削除するには、まずユーザーおよびロールの参照を取得し、次にdropUser
メソッドとdropRole
メソッドを使用します。
User usr; Role role; usrmanager.dropUser(usr); rolemanager.dropRole(role);
次の各例では、ユーザーおよびロールAPIを使用してユーザーを問い合せたり、管理する方法を示します。
次の例では、ユーザーを問い合せるための検索フィルタの設定方法を示します。グループを問い合せるには、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(); } } }
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","password"); // 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(); } } }
次の各項では、プロバイダへのSSL接続に関するUserおよびロールAPIのサポートについて説明します。
ユーザーおよびロールAPIのLDAPプロバイダでは、LDAPアイデンティティ・ストアとのSSLを実現するために、Java Secure Sockets Extension (JSSE)に依存しています。
すぐに使用できるSSLを設定するには、次の手順を実行します。
キーストアおよびキー・パスワードの値を指定し、システム・プロパティを設定します。
String keystore = "<keystore location>"; String keypasswd = "<keystore password>"; System.setProperty("javax.net.ssl.trustStore",keystore); System.setProperty("javax.net.ssl.trustStorePassword", keypasswd);
LDAPサーバーのSSL URLを設定します。
factEnv.put(ADIdentityStoreFactory.ST_LDAP_URL, "ldaps://ldaphost:sslport/");
次のように、セキュリティ・プロトコルをSSLに設定します。
factEnv.put("java.naming.security.protocol","SSL");
SSLをカスタマイズするには、次の手順を実行します。
次のように、カスタム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");