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

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

2018年1月28日日曜日

フォームのアクセス権をプログラムで制御する

皆さん、こんにちは。
いつも冬になると寒いなぁと感じていますが、今年は特に寒さが厳しく感じますよね。
いつも2月が寒さのピークだと思っていますが、1月でこの寒さだと2月になったら・・・
考えるのも嫌になります。

さて、今日は前回(というか前日)の予告通り、
「フォームで文書を作成できるユーザー」の情報をLotusScriptで取得できないものかどうかを確認してみます。
Notes DBは前回作成したものを利用します。

1.なぜ確認するのか?

まずは、なぜ確認する必要があるのかを考えてみます。
少なくともNotesクライアントで利用している場合、「フォームで文書を作成できるユーザー」の設定が行われていれば、自動で制御が行われて、文書が異常に作成されることはなさそうです。
ただし、バックエンドで文書を作成後、その文書を編集するという荒業があるので、確認はできた方が良さそうです。
また、最近はNotesクライアントでの利用ではなく、Webブラウザからの利用を推進する動きもありますので、Webブラウザでの動作についても確認する必要があるでしょう。


2.Web画面で実行するとどうなる?

ということで、Webブラウザで実行するとどうなるかを確認してみましょう。
Webブラウザで動かすには、クラシックWeb(従来のWeb化の方法で、フォームやページを使って行うものですね)とXPagesを使う方法があります。

さきにクラシックWebで行ってみます。
クラシックWebの場合、Notesクライアント用に作成したNotes DBでも改修をしなくてもそこそこ動いてくれるのがいいところですね。
なので、ビューをそのままWebブラウザで表示して、@Command([Compose];"フォーム名")のアクションを実行してみました。

結果はこちら・・・
WebブラウザでのComposeコマンド実行

なんと、エラーになりました!
素晴らしい!ちゃんと「フォームで文書を作成できるユーザー」に設定されている内容を認識するようです。
ただ、エラーメッセージが分かりにくいですね。「アクセスが認証されていません。」だとログインそのものに失敗したのかな?とか変な心配をしてしまいそうです。
ちなみに、設定されているユーザーの場合は、Webブラウザでも新規に文書が作成できました
少なくとも、本来作成できてはいけない文書が作成されるという事はなさそうですね。


3.XPagesの場合はどうなる?

では、つぎにXPagesで試してみましょう。
XPagesの場合、文書を作成するためのページを開いて、そのページの中で「データソース」をバインドするというちょっとやり方になります。

まず、文書を作成するためのページを開くために、ビューページで次のようなアクションを作成しました。
指定したページを開く
このアクションを実行したところ・・・
見事にページが開いてしまいました。
文書を作成するためのページ
NotesクライアントやクラシックWebでは、そもそもこの段階まで進むことができませんでしたので、すでに動きが違うことが分かります。
でも、文書が保存できなければOKですよね。

ではフィールドに値を入力して、保存してみます。
保存にはシンプルアクションの「文書の保存」を選択しました。
現在の文書を保存するというシンプルアクション

結果は・・・保存できちゃいました。
XPagesだと文書が保存できちゃう・・・
あれ?あれれ?
ダメじゃん!XPages!ちゃんと「フォームで文書を作成できるユーザー」を見てよ!困るじゃん!

はい、そういうことで、XPagesの場合は、どうやらバックエンドで文書を作成しているのと同じような動きをしているようです。
これは困りましたね。


4.制御の仕方を考えてみよう

ということなので、やはり「フォームで文書を作成できるユーザー」の値が取得できる必要がありそうです。
では、どうやったら取得できるのでしょうか?
この値はフォームそのものに影響を与えるということは前回の記事の中で紹介しています。
ということは、フォームの情報を取得できれば良さそうだということが考えられます。
IBM Notes/DominoのLotusScriptクラスにはNotesFormというクラスが用意されていますので、そちらを確認してみます。
FormUsersというプロパティがあります。どうやらこれで取得できるのではないでしょうか?
FormUsersプロパティの説明

そこで以下のようなプログラムを作成してみました。
Sub Click(Source As Button)
    On Error Goto ErrProc
    
    Dim session As New NotesSession
    Dim db      As     NotesDatabase
    Dim form    As     NotesForm
    Dim ret     As     String
    
    Set db   = session.CurrentDatabase
    Set form = db.GetForm( "メイントピック" )
    
    ret = "【フォームで文書を作成できるユーザーの一覧】"
    Forall x In form.FormUsers
        ret = ret & Chr$(10) & x
    End Forall
    Msgbox ret, 0 + 64, "FormUsersの確認"
    
    Exit Sub
ErrProc:
    Msgbox _
    "エラー行数:" & Cstr(Erl) & Chr$(10) & _
    "エラー番号:" & Cstr(Err) & Chr$(10) & _
    "エラー内容:" & Error, _
    0 + 16, "FormUsersの確認"
    
    Exit Sub
End Sub

実行した結果は下図の通り。
実行結果

確かに取得できているようです。
あとは、実行しているユーザーがこのユーザー(及びグループ)に合致しているかどうか(グループの場合メンバーかどうか)を確認して文書の作成を許可するかどうかを決めればよいでしょう。

XPagesの場合、LotusScriptではなく、SSJSになりますが、SSJSにもNotesFormクラスがあります(getFormUsers()で取得できます)ので、同じように制御することができるでしょう。


5.まとめ

なかなか難しい話になってしまいましたが、いかがでしたか?
フォームのアクセス権についてはヘルプでもさらっと書いてあっておしまい。なので、なかなか詳細を理解している人は少ないのではないかと思います。
かく言う私も今回色々と調べて分かったことがたくさんありました。

分からないことが起きたら、慌てずにどういうことが起きているのか、本当ならどうなっているべきなのか等々、整理しましょう。
そこから、解決への糸口が見つかるかもしれません。
他の人に質問するにしても、問題が整理されていれば、相手もどこから調べていけばいいのかすぐにわかります。
いちいち整理している暇なんてないよ!すぐにできなければ困るんだ!
という場合であっても、結局はきちんと整理してから調査した方が早いということは多々あります。


今回の場合は、NotesFormクラスのFormUsersプロパティを使うことで、誰がこのフォームで文書を作成してよいのかどうかが分かることが理解できていただければOKでしょう。



それでは今日はこの辺で・・・


Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

0 件のコメント: