第2章
この章では、レルムのユーザ、グループ、およびLDAPコンテナを管理する方法について説明します。この章は、次の節から構成されています。
Directoryサブシステムは、exteNd Directorプロジェクトウィザードを使用して設定した読み取り可能レルムおよび書き込み可能レルムを管理するために使用します。レルム内での認証およびほかのユーザベースの操作を容易にするため、Directoryサブシステムではユーザおよびグループの概念をサポートします。LDAPレルムの場合、Directoryサブシステムでは、コンテナおよびサブコンテナの概念もサポートします。
Directory APIは、ユーザ、グループ、およびコンテナへの完全なプログラム的アクセスを提供します。ユーザ、グループ、およびコンテナは、java.security.Principalに関連付けられています。「プリンシパル」は、アプリケーションリソースへのアクセスの認証に使用されます。
次に、主要なDirectoryサブシステムクラスを示します。
認証は、ユーザ名およびパスワードを取得し、これらをディレクトリレルムの登録ユーザリストに照らして確認することで実行されます。登録されているユーザIDと対応するパスワードを知っているということは、ユーザが本人であることを保証すると想定されます。
各ユーザは、最初に、割り当てられているユーザIDとパスワード、または自分で宣言したユーザIDとパスワードを使用して登録します(または管理者により登録されます)。以後の使用時ごとに、ユーザは、最初に宣言したユーザIDとパスワードを使用する必要があります。
exteNd Directorアプリケーションのユーザが正常に認証された場合、exteNd Directorは、そのユーザのグループとLDAPコンテナメンバーシップのリストを取得し、ユーザセッションの期間中はリストを使用可能な状態に保ちます。このリストは、ユーザが保護されたリソースにアクセスしようとする場合の認証に使用されます。
Portalサブシステムでは、ユーザ認証のためにコアポートレット(Portal Login)が提供されます。プロジェクトウィザードによって生成されたカスタムWebアプリケーションでは、このポートレットがデフォルトで使用されます。
登録ユーザを認証できます。ユーザは、保護されたリソースにアクセスするためのユーザIDおよびパスワードを入力するように要求されます。 |
---|
|
ポータルアプリケーションでは、次のことができます。
このポートレットのソースは、exteNdのインストールディレクトリのDirector/templates/TemplateResources/portal-core-resourceにあります。
次のコードは、ユーザの認証方法を示します。
// Get a directory delegate. EbiDirectoryDelegate dirService = com.sssw.fw.directory.client.EboFactory.getDirectoryDelegate(); // Initialize principal object. java.security.Principal prin = null; try { // Attempt to authenticate the user ID and password. prin = dirService.authUserPassword(context, uid, pwd); } catch (Exception ex) {}
この節では、Directory APIを使用して設定されたレルムにユーザおよびグループを追加する方法について説明します。ユーザおよびグループを追加すると、セキュリティACLを割り当てるために、関連付けられているプリンシパルオブジェクトが自動的に追加されます。
コンテナの追加 Directory APIからLDAPコンテナを追加することはできません。これを行うには、ネイティブLDAPレルムツールを使用してください。ただし、既存のコンテナにはアクセスできます。ユーザ、グループ、およびコンテナへのアクセスを参照してください。
DACを使用したユーザおよびグループの追加 DAC (Director Administration Console)を使用して新規ユーザおよびグループを追加することもできます。詳細については、を参照してください。
新規ユーザポートレットを使用したユーザの追加 Portalサブシステムでは、匿名ユーザがユーザ自身で登録できるように「新規ユーザ」という名前のコアポートレットが提供されています。ポータルウィザードによって生成されたカスタムWebアプリケーションは、このポートレットをデフォルトで使用します。DAC管理コンソールおよびCMS管理コンソールはどちらも新規ユーザポートレットのカスタマイズされたバージョンを使用します。
詳細については、新規ユーザポートレットについてを参照してください。
ユーザを追加するには、EbiDirectoryDelegateオブジェクトのaddUser()メソッドを使用します。また、次の例に示すように、EboDirectoryHelperのメソッドを使用してユーザの情報を取得することもできます。
例:自己登録キーの確認 次のコードは、ユーザが自己登録できるかどうかを判別します。
m_isLoginNewUsersEnabled = EboDirectoryHelper.isLoginNewUsersEnabled();
プロパティは、Directoryサブシステムのconfig.xmlファイルに設定されます。
<property> <key>com.sssw.fw.directory.LOGIN_NEW_USERS_ENABLED</key> <value>true</value> </property>
例:レルムへのユーザの追加 次のコードは、新規ユーザの登録方法を示します。
// Get the context.Use this method or one of the others // available on the factory object. EbiContext.context = com.sssw.fw.factory.getDirectoryDelegate() // Get directory delegate. EbiDirectoryDelegate delegate = com.sssw.fw.directory.client.EboFactory.getDirectoryDelegate(); // Add the user. delegate.addUser(context, user, pwd); }
LDAPユーザの追加 書き込み可能なLDAPレルムでは、完全修飾名(識別名)または共通名を指定できます。APIは、プロジェクトウィザードで指定されたLDAP設定パラメータに依存しています。
詳細については、『exteNd Directorアプリケーションの開発』のLDAPレルム設定に関する節を参照してください。
注記: できる限り完全修飾名を使用してください。これにより、別のコンテナで同一のIDを持つユーザとの競合が避けられます。
書き込み可能レルムにグループを追加するには、ディレクトリ委任のaddGroup()メソッドを使用します。
EbiDirectoryDelegate delegate = com.sssw.fw.directory.client.EboFactory.getDirectoryDelegate(); // Add the user. delegate.addGroup(context, groupName); }
ユーザをグループに追加するには、GroupオブジェクトのaddMember()メソッドを使用します。
try { EbiDirectoryDelegate delegate = com.sssw.fw.directory.client.EboFactory.getDirectoryDelegate(); Group group = delegate.getGroup(); Principal user = delegate.getUser(context, username); group.addMember(user); } return true; } catch (Exception e) { } return false;
ディレクトリ委任では、ユーザおよびグループを取得するいくつかのメソッドが提供されます。EbiDirectoryDelegateのgetUsers()およびget Groups()メソッドを参照してください。レルムコンテナ委任には、LDAPのようなツリーレルムのコンテナにアクセスするためのメソッドがあります。EbiRealmContainerDelegateを参照してください。
この節で説明するほとんどのメソッドは、ユーザ、グループ、またはコンテナに関連付けられたプリンシパルを返します。これにより、Security APIを使用してセキュリティACLを設定できます。
Directory APIは、サポートされているレルム設定でユーザおよびグループのクエリをサポートします。この機能を使用すると、クエリ文字列を指定して、ユーザおよびグループのフィルタされたリストを取得できます。クエリを使用することにより、特に大規模なディレクトリではパフォーマンスが向上します。Directory APIには、クエリをサポートする2つのクラスが含まれています。
次に、使用方法の例をいくつか示します。
// Get a directory delegate. EbiDirectoryDelegate delegate = com.sssw.fw.directory.client.EboFactory.getDirectoryDelegate(); // Get the query object. EbiDirectoryUsersQuery query =EboFactory.getDirectoryUsersQuery(); // Specify a query string. query.whereUserIDStartsWith(search_str); if (!EboStringMisc.isEmpty(myRealm))query.whereRealmName(myRealm); if (!EboStringMisc.isEmpty(myGroup))query.whereGroupID(myGroup); // Get collection of EbiRealmUsers. Collection users =delegate.getUsers(context, query); // EbiRealmUser objects are returned.
// Get a directory delegate. EbiDirectoryDelegate delegate = com.sssw.fw.directory.client.EboFactory.getDirectoryDelegate(); // Specify query strings. EbiDirectoryGroupsQuery query = getDirectoryGroupsQuery(); query.whereGroupIDStartsWith(search_str); // To retrieve children of "root" groups only. query.whereParentGroupID(EbiDirectoryConstants.DIRECTORY_ROOT_GROUP); if (!EboStringMisc.isEmpty(myRealm))query.whereRealmName(myRealm); // Get a collection of EbiRealmGroups. Collection groups = delegate.getGroups(context, query); // EbiRealmGroup objects are returned.
Directoryサブシステムでは、eDirectoryレルムに存在する既存のダイナミックグループへのアクセスがサポートされています。ダイナミックグループは、クエリによってグループをダイナミックに定義できるようにするLDAPレルム機能です。
注記: exteNd Directorでは、ダイナミックグループの作成または変更をサポートしていません。これを行うには、LDAPクライアントツールを使用します。
ダイナミックグループにアクセスするには、exteNd Directorプロジェクトを設定する必要があります。詳細については、exteNd Directorアプリケーションの開発のLDAPレルム設定に関する節を参照してください。
ダイナミックグループにアクセスするには、EbiDirectoryDelegateのgetGroup()メソッドの1 つを使用します。ダイナミックグループレルムステータスを判別するこのメソッドは、委任にもあります。
public boolean isDynamicGroupSupported(String realm)
eDirectoryのダイナミックグループについての詳細は、次を参照してください。
http://developer.novell.com/research/appnotes/2002/april/05/a0204054.htm
コンテナ委任メソッドを使用して、LDAPまたは同様のツリータイプレルムにあるコンテナプリンシパルにアクセスできます。
注記: コンテナプリンシパルに対してACLを設定することにより、コンテナ階層のユーザにセキュリティ継承を適用できます。詳細については、コンテナのACLへのアクセスを参照してください。
次の例は、ルートコンテナおよびその子孫を取得する方法を示します。
// Intialize Java container object. Collection availContainers = null; // Get container delegate. EbiRealmContainerDelegate conDelegate = com.sssw.fw.directory.client.EboFactory.getRealmContainerDelegate(); // Get the root (top) container. EbiRealmContainer root = conDelegate.getRootContainer(context); // Get Collection of EbiRealmPrincipals. EbiRealmContainer\qs and/or EbiRealmUser\qs) if (root != null) { availContainers = conDelegate.getDescendants(context, root, true, false); if (availContainers != null) { availContainers.add(root) ; } else { availContainers = new ArrayList(); availContainers.add(root) ; } } return availContainers; }
Copyright © 2004 Novell, Inc. All rights reserved. Copyright © 1997, 1998, 1999, 2000, 2001, 2002, 2003 SilverStream Software, LLC. All rights reserved. more ...