34 管理システムのユーザーの管理
WebCenter Sitesでは、USER
タグによる認証機能、DIR
タグによるユーザー・プロファイル管理が用意されており、アクセス制御リスト(ACL)によりデータベース表およびレンダリングされたページのセキュリティが強化されています。これらのユーザー管理とセキュリティのメカニズムを使用して、ユーザーを管理し、配信システムおよびWebCenter Sitesの開発システムと管理システムに対するユーザーのアクセスを制御します。
トピック:
34.1 ディレクトリ・サービスAPIについて
ディレクトリ・サービスAPIは、WebCenter Sitesシステムで認証情報、ユーザー情報などが格納されているディレクトリ・サーバーへの接続を有効化します。WebCenter Sitesは3つのディレクトリ・サービスのプラグインを配信しており、そのうちの1つはWebCenter Sitesシステムとともにインストールされます。
-
WebCenter Sitesディレクトリ・サービス・プラグイン: ネイティブのWebCenter Sitesユーザー管理表(
SystemUsers
表およびSystemUserAttrs
表)を使用します。 -
LDAPプラグイン: 任意のJNDIサーバーをサポートします。
-
NTプラグイン: ユーザー資格証明とログイン名はNTディレクトリから取得しますが、その他のすべてのユーザー情報は
SystemUserAttrs
表から取得します。
プラグインはWebCenter Sitesシステムのインストール時にインストールされ、構成するにはwcs_properties.json
ファイルでプロパティを設定します。ユーザー管理との構成の詳細は、『Oracle Fusion Middleware Oracle WebCenter Sitesの管理』のLDAPプラグインの理解に関する項を参照してください。
この項には次のトピックが含まれます:
34.1.1 エントリ
ディレクトリのエントリは、割り当てられた属性(特にユーザーおよびグループ・タイプのエントリ)を備えた名前付きオブジェクトです。
-
ユーザー・タイプ・オブジェクトには、識別名および一連の属性として一般名、ユーザー名、パスワード、電子メールなどが備わっています。
-
WebCenter Sites ACLと同様、グループ・タイプ・オブジェクトにも識別名と一連の属性があります。
名前には、名前が関連付けられた階層が反映されます。ディレクトリ実装での移植性を確保するために、名前は不透明な文字列として処理する必要があります。
34.1.2 階層
一部のディレクトリ・データベースは、階層構造を使用してエントリを編成します。WebCenter Sitesのディレクトリ・サービスAPIでは、エントリの属性と階層内でのその場所は個別になっています。その結果、エントリの属性の取得によってその子の情報は発生しません。
階層に対するサポートは、基礎となるディレクトリの実装に応じて異なります。たとえば、LDAPディレクトリは階層構造をサポートしますが、WebCenter Sitesのネイティブ・ディレクトリ・データベースは階層構造をサポートしません。ディレクトリ実装での移植性を確保するために、コードは階層データのサポートを想定していません。
ノート:
グループ階層は、内部のWebCenter Sitesの権限に影響を及ぼしません。
34.1.3 グループ
WebCenter Sitesのディレクトリ・サービスAPIは、参照整合性を実行しません。ディレクトリ・タグを持つユーザーを削除する場合は最初に、ユーザーが関連付けられているグループからユーザーを削除します。これにより、グループのメンバーシップも削除されるようにします。
メンバーがグループに追加されるたびに、JNDI実装では、addmember
タグに渡される名前とは関係なく、uniquemember
属性の値に対して完全に識別される名前が作成されます。
34.1.4 ディレクトリ・サービス・タグ
次の表に示すように、DIR
タグ・ファミリをXMLおよびJSPの両バージョンで使用して、ディレクトリ・サービスAPIを起動できます。
表34-1 ディレクトリ・サービス・タグ
タグ | 説明 |
---|---|
|
属性を既存のエントリ(ユーザーまたはグループのいずれか)に追加します。 |
|
メンバーをグループ(通常はユーザー)に追加します。 |
|
リスト変数の特定の親に対する子エントリを取得します。 |
|
ディレクトリ・エントリを作成します。 |
|
ディレクトリ・エントリを削除します。 |
|
リスト変数の特定のエントリに対する属性値を取得します。 |
|
指定されたグループのメンバーのリストを作成します。 |
|
エントリ(グループまたはユーザーのいずれか)が属するすべてのグループのリストを作成します。 |
|
ディレクトリ内のすべてのユーザーのリストを返します。 |
|
エントリの属性値を削除します。 |
|
グループのエントリを削除します。 |
|
エントリ(ユーザーまたはグループのいずれか)の属性値を置換します。 |
|
指定された検索基準と一致するエントリのディレクトリを検索します。 |
ディレクトリがLDAP、WebCenter Sitesのみのいずれを使用して実装しているかに関係なく、DIR
タグで記述するコードは酷似しています。
『Oracle WebCenter Sitesリファレンス・タグ・リファレンス』およびディレクトリ・サービスのコード・サンプルを参照してください。
34.1.5 ディレクトリの操作
一部のWebCenter Sitesディレクトリ・サービスのタグは、データベースに情報を書き込みます。データベース管理者が、データベースへのユーザー情報の追加など、Webサイトへの書込み操作をすべて処理している場合、ディレクトリ・タグの使用を読取り専用の操作に制限します。このポリシーによって、サードバーティのディレクトリ管理ツールとの同期化に関する問題が回避されます。
読取り専用操作については、この項で説明します。現在の認証済ユーザーの資格証明と読取り権限を使用して、これらの操作を実行します。
この項には次のトピックが含まれます:
34.1.5.1 検索
一部のディレクトリ・サーバーの制限のため、組織の最上位レベルからの検索は許可されていません。移植性の問題を回避するために、DIR.SEARCH
タグのコンテキスト属性を必ず指定してください。
34.1.5.2 ユーザーの検索
ユーザーのルックアップには、通常、次の2つのステップを実行します。
- エントリ名を取得するには、
userid
のDIR.SEARCH
をコールします。 - 問題のユーザーの属性を取得するには、
DIR.GETATTRS
をコールします。
34.1.5.3 ユーザーのリスト作成
ユーザーのリストを作成するには、次の3つの方法のいずれかを使用することをお薦めします。
-
小規模のユーザー・データベースの場合、
DIR.LISTUSERS
タグを使用します。これは、peopleParent
プロパティに従ってすべてのユーザーのリストを再帰的に作成します。このタグの使用は、より大規模なユーザー・データベースでは非効率的です。 -
より大規模なユーザー・データベースの場合、階層の移動には
DIR.CHILDREN
タグを使用します。DIR.CHILDREN
タグはグループ・タイプには最適ですが、ユーザー・タイプには適していません。 -
フラットな階層を持つユーザー・データベースの場合、検索結果を絞り込みます。
34.1.5.4 ディレクトリ・サービスのコード・サンプル
次のJSPコード・サンプルは、可能なディレクトリ操作を示しています。
<% String sMainTestUserName = "user name"; String sMainTestUserPW="password"; String sPeopleParent = ics.GetProperty("peopleparent", "dir.ini", true); String sGroupParent = ics.GetProperty("groupparent", "dir.ini", true); String sUsername = ics.GetProperty("username", "dir.ini", true); String sCommonName = ics.GetProperty("cn", "dir.ini", true); IList mylist; %> <user:su username='<%=sMainTestUserName%>' password='<%=sMainTestUserPW%>'> <H2>List All Users</H2> <ics:clearerrno/> <dir:listusers list='mylist'/> <br> <b>dir:listusers errno: <ics:getvar name='errno'/></b> <ics:listloop listname='mylist'> <br><ics:listget listname='mylist' fieldname='NAME'/> </ics:listloop> <H2>Look Up the ContentServer User by Username</H2> <ics:clearerrno/> <dir:search list='mylist' context='<%=sPeopleParent%>'> <dir:argument name='<%=sUsername%>' value='ContentServer'/> </dir:search> <br><b>dir:search errno: <ics:getvar name='errno'/></b> <% mylist = ics.GetList("mylist"); if(mylist.numRows() != 1) { out.print("<br>Error finding entry."); } mylist.moveTo(1); ics.SetVar("ContentServerDn", mylist.getValue("NAME")); %> <H2>Show ContentServer Attributes</H2> <ics:clearerrno/> <dir:getattrs list='mylist' name='<%=ics.GetVar("ContentServerDn")%>'/> <br><b>dir:getattrs errno: <ics:getvar name='errno'/></b> <ics:listloop listname='mylist'> <br> <ics:listget listname='mylist' fieldname='NAME'/>= <ics:listget listname='mylist' fieldname='VALUE'/> </ics:listloop> <H2>Show Group Memberships for ContentServer</H2> <ics:clearerrno/> <dir:groupmemberships name='<%=ics.GetVar("ContentServerDn")%>' list='mylist'/> <br><b>dir:groupmemberships errno: <ics:getvar name='errno'/></b> <ics:listloop listname='mylist'> <br> <ics:listget listname='mylist' fieldname='NAME'/> </ics:listloop> <H2>Lookup the SiteGod Group by CommonName</H2> <ics:clearerrno/> <dir:search list='mylist' context='<%=sGroupParent%>'> <dir:argument name='<%=sCommonName%>' value='SiteGod'/> </dir:search> <br><b>dir:search errno: <ics:getvar name='errno'/></b> <% mylist = ics.GetList("mylist"); if(mylist.numRows() != 1) { out.print("<br>Error finding entry."); } mylist.moveTo(1); ics.SetVar("SiteGodDn", mylist.getValue("NAME")); %> <H2>Show SiteGod Attributes</H2> <ics:clearerrno/> <dir:getattrs list='mylist' name='<%=ics.GetVar("SiteGodDn")%>'/> <br> <b>dir:getattrs errno: <ics:getvar name='errno'/></b> <ics:listloop listname='mylist'> <br> <ics:listget listname='mylist' fieldname='NAME'/>= <ics:listget listname='mylist' fieldname='VALUE'/> </ics:listloop> <H2>Show SiteGod Group Members</H2> <ics:clearerrno/> <dir:groupmembers name='<%=ics.GetVar("SiteGodDn")%>' list='mylist2'/> <br> <b>dir:groupmembers errno: <ics:getvar name='errno'/></b> <ics:listloop listname='mylist2'> <br> <ics:listget listname='mylist2' fieldname='NAME'/> </ics:listloop> <H2>Children of groupparent </H2> <ics:clearerrno/> <dir:children name='<%=sGroupParent%>' list='mylist'/> <br> <b>dir:children errno: <ics:getvar name='errno'/></b> <ics:listloop listname='mylist'> <br> <ics:listget listname='mylist' fieldname='NAME'/> </ics:listloop> </user:su>
34.1.6 エラーの処理
どのディレクトリ・タグでも、設定時に様々なディレクトリ・エラーが発生する可能性があります。ディレクトリ・サービスのエラー・メッセージの包括的なリストは、『Oracle WebCenter Sitesリファレンス・タグ・リファレンス』を参照してください。
ディレクトリ・サービスのコードによって、指定されたタグ・コールでリストされたそれぞれのエラー・コードが処理される必要があります。これは、J2EE JNDIインタフェースをサポートするために必要です。
34.1.7 ディレクトリ・サービス・アプリケーションのトラブルシューティング
ディレクトリ・サービス・アプリケーションのトラブルシューティングの最初のステップは、エラー・ログ(WebCenter Sitesのログ・ファイル内の)のチェックです。
ディレクトリ・サービスのロギングを有効にするには、log.filterLevel
プロパティ(logging.ini
プロパティ・ファイル内にある)を設定します。次のように、7レベルのエラー・メッセージがあります。
-
fatal: 致命的なレベルのメッセージを記録します。
-
severe: 重度および致命的なレベルのメッセージを記録します。
-
error: エラーおよび致命的なレベルのメッセージを記録します。
-
warning: 警告および致命的なレベルのメッセージを記録します。
-
info: 警告、エラー、重度および致命的なレベルのメッセージを記録します。
-
trace: トレース・メッセージを記録します。
-
詳細: すべてのタイプのメッセージを記録します。
トラブルシューティング時には、trace
が最も詳細な設定であり、そのためパフォーマンスへの影響は最も高くなります。
ディレクトリ・サービスは、エントリの使用を次の書式で記録します。
[<timestamp>][Directory-<severity>-<errno>] [<class>:<method>][<message>][<session id>]
次に例を示します。
[Jan 17, 2002 1:49:44 PM][Directory-T] [BaseFactory:instantiateImplementation(ICS,String,Class[], Object[])][Instantiating:com.openmarket.directory.common.Factory] [PEccxyF1Ueh7zYvjNgg4D6bqZzf0llfWMaiBimIN9H1Z9KomDcPy]
前のメッセージはトレース(T)であるため、関連付けられたerrno
値はありません。
「エラーのロギングおよびデバッグ」を参照してください。
LDAP実装の共通の問題は、ディレクトリ・サーバーで誤って指定される権限です。エラー・ログが権限問題を示している場合には、ディレクトリ・サーバーの権限の設定をチェックして、認証されたユーザーがリクエストされた操作を実行する権限を持っていることを確認します。ディレクトリ・サーバーに直接ログインして(WebCenter Sites外)、権限が正しく設定されていることを確認するために同じアクションを実行します。ログと権限をチェックした後は、プロパティ・ファイルを調べることで、多くの場合構成エラーを解決できます。
『Oracle Fusion Middleware Oracle WebCenter Sitesプロパティ・ファイル・リファレンス』を参照してください。
34.2 カスタム・ユーザー・マネージャの使用
CustomUserManagerクラス経由で使用可能な実装を使用して、データベース表またはLDAP (または他のディレクトリ・プロトコル)に格納されているユーザー情報にアクセスできます。
トピック:
34.2.1 カスタム・ユーザー・マネージャとは
WebCenter Sitesが標準装備する認証メカニズムよりも高い柔軟性を求めるユーザー向けに、オラクル社ではデータベース表またはLDAP (または他のディレクトリ・プロトコル)に格納されているユーザー情報にアクセスするための実装も提供しています。このような実装は、CustomUserManagerクラス経由で使用できます。
CustomUserManagerクラスを使用すると、クライアントは既存のアーキテクチャを拡張して、任意のユーザー・リポジトリへの接続を実装できます。この接続は、WebCenter Sitesユーザーを認証および認可するために使用します。ユーザー・ディレクトリへの読取り専用アクセスを備えています。すべてのユーザー・メンテナンス作業が中央のディレクトリ・システムで行われるため、書込みアクセスは必要ありません。UserDirectoryの実装担当者には、任意のユーザー・リポジトリにあるユーザーのユーザー属性をWebCenter Sitesが使用する属性に正しくマップする責任があります。たとえば、サイト単位のACLとロールです。
サイト・アーキテクチャを拡張するためのインタフェース
-
oracle.fatwire.sites.directory.custom.UserDirectory
: クライアントがこのインタフェースを実装します。WebCenter Sitesは、クライアントの実装を呼び出して、ユーザーを認証し、ユーザー・ロールおよびACLを取得します。 -
oracle.fatwire.sites.directory.custom.UserFactory
およびoracle.fatwire.sites.directory.custom.UserFactory.Builder
: WebCenter Sitesは、ユーザー情報を移入するためのコンテナとして、これらのインタフェースの実装を備えています。
『Oracle Fusion Middleware Oracle WebCenter Sites Java APIリファレンス』を参照してください。
WebCenter Sitesは、任意のユーザー・リポジトリからのユーザー情報やロールをキャッシュしません。クライアントは、ユーザー情報およびロールのキャッシングを処理するように実装をカスタマイズできます。クライアントは、config
ディレクトリ: xcelerate.rolemanagerclass=com.openmarket.xcelerate.roles.RoleManager
にあるwcs_properties.json
にこのプロパティを設定した後、WebCenter Sitesに新規ロールを作成できます。
これらのロールを更新することはできません。
WebCenter Sitesをアップグレードすると、プロパティに対するすべての変更が保持されます。ただし、クライアントはUserDirectory実装に使用されるクラスをバックアップする必要があります。
カスタム・ユーザー・マネージャ用のログ出力
このカスタム・ユーザー管理カスタマイズ・フック用に新規ログ出力oracle.wcsites.directory.custom
が追加されています。このフックにより、クライアントは独自の認証を柔軟にカスタマイズまたは定義できます。ログ・レベルにはTRACEを使用します。従来のコードは、引き続き古いログ出力(dirLogger/ics.LogMsg()
、logging.ini
、com.fatwire.logging.cs.auth
、com.fatwire.logging.cs.session
など)を使用します。
34.2.2 カスタム・ユーザー・マネージャのサンプル実装
カスタム・ユーザー・マネージャを十分に理解できるように、WebCenter Sitesリポジトリにサンプル実装が用意されています。
サンプル・コードは、<ORACLE_HOME>/wcsites/webcentersites/sites-home/bootstrap/samples/CustomUserManager
にあります。
この実装は、次のファイルで構成されています。
-
user-repository.json
: このjsonファイルには、ユーザー名、暗号化されたパスワード、ロール、ACLなどのユーザー詳細が格納されています。userIdに、インストール時に定義されたとおりに適切な親文字列が含まれていることを確認します。親文字列の値については、wcs_properties.json
ファイルでpeopleparentプロパティを参照してください。 -
FileUserRepository.java
: ユーザー情報のバックエンド・ストアです。jsonファイルを読み込み、メモリーにSampleUserオブジェクトを移入します。user-repository.json
に対する変更を反映するには、サーバーを再起動する必要があります。 -
SampleUser.java
: メモリーにユーザー情報を保持します。 -
SampleUserRepository.java
: このクラスは、oracle.fatwire.sites.directory.custom.UserDirectory
インタフェースを実装します。WebCenter Sitesは、ユーザーを認証したり、ユーザー・ロールを取得したり、ユーザー一致基準をリストする必要があるときなどに、この実装を呼び出します。
WebCenter Sites 12.2.1.2.0以降では、サンプル実装プロジェクトのコンパイルが容易になりました。プロジェクト設定を理解するには、<ORACLE_HOME>/wcsites/webcentersites/sites-home/bootstrap/samples/CustomUserManager
にあるReadMe.txtを参照してください。
34.2.3 WebCenter Sitesとサンプル実装の統合
カスタム・ユーザー・マネージャのサンプル実装を統合するために必要なのは、wcs_properties.json
ファイルに対していくつかのプロパティを変更および追加し、プロジェクトをコンパイルし、アプリケーション・サーバー・クラス・パスを更新することだけです。
34.2.4 カスタム・ユーザー・マネージャに関する必知事項
すべてのユーザー・メンテナンス作業が中央のディレクトリ・システムで行われるため、UserDirectoryインタフェースにはユーザー・ディレクトリへの読取り専用アクセスが用意されています。
-
このため、次の操作が機能しない場合や、誤った成功メッセージが表示される場合があります。
-
<DIR>タグを使用すると、ユーザー・プロファイルの作成と更新や、ユーザー・ロールの追加などの機能を実行できます。これらのタグを呼び出すと、その操作は例外をサポートしないことがログに記録され、ICSスコープでエラー番号15004が設定されます。
-
WebCenter SitesのUIでは、これらのタグが様々な場所で使用されます。UIフォームは、まだインタフェース・ページでのエラー・メッセージを反映するように変更されていません。このため、ユーザー・プロファイルの更新(またはこの種の他の操作)を行うと、操作が正常に完了したと誤って表示されることがありますが、実際には何も変更されていません。
-
-
RESTグループ・セキュリティは、これまでどおり機能する必要があります。ユーザーがRESTリソースにアクセスするときには、そのユーザーが適切なグループに割り当てられていることを確認します。
34.3 ユーザー・アクセスの制御
WebCenter Sitesは、アクセス制御リスト(ACL)でユーザーを管理します。ACLを使用すると、WebCenter Sitesデータベース内の表と、WebCenter Sitesによりサイトで処理したレンダリング済ページへのアクセスを制限できます。ユーザーがユーザー名およびパスワードを使用してログインするサイトの1つ以上のACLに登録済ユーザーを関連付ける必要があります。
ユーザーが最初にサイトを訪れると、WebCenter Sitesではセッションが作成され、そのユーザーは標準デフォルト・ユーザーDefaultReader
として暗黙的にログインされます。USER.LOGIN
コマンドが使用されてユーザーがパスワードで認証されると、ユーザーのIDが更新されます(関連付けられたACLが有効になります)。
次のトピックを参照してください。
34.3.1 ACLタグ
WebCenter Sitesには、ACLの作成に使用できる一連のアクセス制御リストのタグ(XMLおよびJSPの両バージョン)が用意されています。管理システムのWebCenter SitesインタフェースかWebCenter Sites ACLタグのいずれかを使用して、管理システムのユーザー・アカウントで必要なACLを作成できます。次の表は、ACLタグのリストです。
表34-2 ACLタグ
タグ | 説明 |
---|---|
|
ACLを作成します。 |
|
ACLを削除します |
|
ACLにフィールドを収集します |
|
ACLからフィールドをコピーします |
|
ACLのリストを取得します |
|
ACLをロードします。 |
|
ACLを保存します。 |
|
ACLからフィールドを散布します |
|
ACL内のフィールドを設定します |
関連項目:
-
ACLタグ: 『Oracle WebCenter Sitesリファレンス・タグ・リファレンス』を参照してください。
-
一般的なACL: 『Oracle WebCenter Sitesの管理』を参照してください。
34.3.2 USERタグ
WebCenter Sitesでは、次の表で説明するUSER
タグ(XMLおよびJSPの両バージョン)も用意されています。これらのタグは、ユーザーをログインおよびログアウトさせるページ上で使用します。
表34-3 ユーザー・タグ
タグ | 説明 |
---|---|
USER.LOGIN
|
ユーザーをログインさせます。 |
USER.LOGOUT
|
ユーザーをログアウトさせます。 |
USER.SU
|
アカウント作成、ユーザー・プロファイルの編集などの操作を実行するために、特定のユーザーとしてユーザーをログインさせます。 |
『Oracle WebCenter Sitesリファレンス・タグ・リファレンス』を参照してください。
34.3.3 WebCenter Sitesおよび暗号化
WebCenter Sitesには、パスワードやその他の機密関係の情報を暗号化するデフォルト・キーが用意されています。独自の暗号化キーを指定するには、Utilities
クラスのencryptString
メソッドを使用します。暗号化を処理するJavaメソッドの情報は、Oracle WebCenter Sites Java APIリファレンスを参照してください。
また、WebCenter SitesではSecure Sockets Layer (SSL)もサポートされており、これによってWebサーバーを出入りする情報の暗号化が許可されます。『Oracle Fusion Middleware Oracle WebCenter Sitesの管理』のセキュリティの実装に関する項を参照してください。