当ブログに掲載しているサンプルは、すべて利用者の自己責任という形でお願いします。
ただし、明らかな不具合がある場合、ご連絡いただければ、訂正記事を出します。
また、こちらのサンプルは、別のサイト等への公開、転載は一切禁止しています。
どうしてもと言う場合は、筆者にあらかじめご連絡ください。

テクてく Lotus 技術者 Slack に参加しよう!

2012年9月26日水曜日

XPagesでノーツアプリケーションのアクセス権をチェックしてみよう!

こんにちは、月火はちょっと違うことをしていたので、ブログを書けませんでした。
え?土日があるだろ?そんな鬼のようなことは言わないでくださいね。

ということで、土日はしっかりと休んだ筆者への応援ボタンをクリックしてから本文を読むようにしてください。
にほんブログ村 IT技術ブログへ


今日もXPagesです。
本当はExtension Library関係の事を書きたかったのですが、ちんぷんかんぷんだったので、またの日にします。

今回は、タイトルにもあるように、ノーツDBのアクセス権について触れてみます。

アクセス権は、「作成者」「編集者」「読者」等の他に「文書の作成」「文書の削除」「個人エージェントの作成」等の特殊権限もあります。

このうち、前者のアクセス権については、以下の方法で取得できます。
ちなみに、計算結果フィールドコントロールを設置して、その値に式を記述します。
requestScope.dbPathName = @Subset(@DbName(), -1);
var chkDb:NotesDatabase = session.getDatabase( @Subset(@DbName(), 1), requestScope.dbPathName, false );

switch ( chkDb.getCurrentAccessLevel() ) {
    case NotesACL.LEVEL_MANAGER   : return "管理者";
    case NotesACL.LEVEL_DESIGNER  : return "設計者";
    case NotesACL.LEVEL_EDITOR    : return "編集者";
    case NotesACL.LEVEL_AUTHOR    : return "作成者";
    case NotesACL.LEVEL_READER    : return "読者";
    case NotesACL.LEVEL_DEPOSITOR : return "投稿者";
}
4行目のchkDb.getCurrentAccessLevel()
が、ノーツアプリケーションのアクセス権を取得するところです。
chkDbは、汎用性を持たせるために、データベース名を指定できるようにしていますが、サンプルであれば、
database.getCurrentAccessLevel()
としても良いでしょう。

ちなみに、ブラウザで動作確認をする場合、ACLの設定にある「Web ユーザーによるアクセスの上限」によっては、アクセス権が違うように表示されるので注意してください(上記の設定のデフォルト値は"編集者")。
Webユーザーによるアクセスの上限


さて、もう一つの特殊な権限について確認しましょう。

従来のノーツアプリケーションの場合、@関数の@UseAccessが使えるので簡単にチェックできますが(現在のDBに対するアクセス権を求める を参照)、XPages にはこの関数は存在しません。

では、どうするのか?と言えば、
SSJSのNotesDatabaseクラスのqueryAccessPrivilegesを使います。
LotusScriptのNotesDatabaseクラスにもQueryAccessPrivilegesという同名のメソッドがあるので、使ったことがある方もいるのではないでしょうか?


このメソッドは使い方が特殊で、結果はビット演算で取得する必要があります。
下記は、「文書の作成」の権限をもっているかどうかを確認するための式です。
requestScope.uname = @UserName();
var user    = requestScope.uname;
var chkDb:NotesDatabase = session.getDatabase( @Subset(@DbName(), 1), requestScope.dbPathName, false );
var accPriv = chkDb.queryAccessPrivileges( user );

if ( (accPriv & NotesDatabase.DBACL_CREATE_DOCS) > 0 ) {
    return "あり";
}
6行目のNotesDatabase.DBACL_CREATE_DOCSは、文書の作成を表す定数です。

この他の定数については、ヘルプ(Lotus Domino Designerを起動した状態で、[ヘルプ][ヘルプ目次]メニューを実行)のNotesDatabaseクラスのqueryAccessPrivilegesを参照願います。

下図は、サンプルを実行したときの画面です。
サンプル実行画面

文書の作成、文書の削除、個人エージェントの作成等、各種権限について、一つずつ確認して、画面に表示するようにしたものです。

もっと工夫をすれば、指定したDBの指定したユーザーのアクセス権について、画面に表示させることも出来ますね。
そこは皆さんで、応用してみてください。





【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

7 件のコメント:

Nozomi Taniguchi さんのコメント...

いつもブログ参照に勉強させてもらってます!ありがとうございます!
ちょうど今ここで引っかかっているので、
ちょっと一言。。
database.queryAccessPrivileges(user)についてです。
userに基本名(英語名)と別名(日本語名)それぞれ実行すると、別の値が返ってくることがあります。
それは、取得元のdatabaseのACLの、基本名・別名の指定の仕方で変わってきます。
ACLにルールがなく、基本名や別名が混在している場合、queryAccessPrivilegesは正しい値を返さないことがあるようなのでご注意を…
現状、打開策はなさそうです(T_T)
もし、何か良い策があればまたお教えください。。

Guy Locke さんのコメント...

Nozomi Taniguchiさん、コメントありがとうございます。

基本名と別名が混在していると大変ですね。
筆者の場合、基本的にACLには日本語は設定しません。お客様が設定されている場合は、できるだけ止めてもらっています。
グループのメンバーに日本語名を設定することも可能ですが、これも見つけたら基本名に直してもらってます。

ダメと書いてないからではなく、怪しいな?と思ったらやらない方が良いでしょう。
・・・と、回答になってますかね?なってないな。

Guy Locke さんのコメント...

ちなみに、私がテストした範囲では、
database.queryAccessPrivileges(user)
のuserには、基本名を設定しておけば問題はなさそうでした。

ACLに
1.基本名で直接登録されている。
2.グループ(メンバーは基本名)で登録されている。
3.別名で直接登録されている。
4.グループ(メンバーは別名)で登録されている。
という時に、
database.queryAccessPrivileges(user)は一応、正しい結果を返してくれました。
userに別名を指定している場合、ACLにグループで登録されていたりすると変な結果になりました。

なので、userは基本名で指定しましょう。

Kazunori Tatsuki さんのコメント...

いつも素晴らしい投稿に助けられています。

ユーザー権限チェックで
database.queryAccess();
っていう関数もありますね。
こちらだとACLの設定にある「Web ユーザーによるアクセスの上限」による制限を受けることなく値が取れるようです。

Masahiko Miyo さんのコメント...

Tatsukiさん、コメントありがとうございます。

「database.queryAccess();」の存在を失念していました。
選択したユーザのACLという記事でLotusScriptで取り扱っていたのに気が付きませんでした。
こちらを使う方が良いですね。本当にありがとうございます!!

Kazunori Tatsuki さんのコメント...

Guy Lockeさん、追加情報になるのですが、
Domino 9.0.1 もしくはExtension LibraryにあるuserBeanを使うと更に便利にACL周りの情報が取得できますね。

userBeanの使い方はこちらが参考になると思います。
http://www.xpages.jp/demos/xpagesext.nsf/Domino_UserBean.xsp

Masahiko Miyo さんのコメント...

Tatsukiさん、追加情報ありがとうございます!
userBeanを使った方がXPagesっぽいですね(^^
詳細を調べて理解できるようになったら、記事にしてみます!