2022年1月26日水曜日

Flows for APEXによる経費精算アプリの作成(3) - レーンとロールを使ったアクセス制御

 経費精算のフロー・ダイアグラムを記述する際に、プールを4つのレーンに分割しています。4つのレーンはそれぞれ、従業員上司部門長経理としています。これらをAPEXのアプリケーションのロールに対応させることにより、ワークフローに含まれるステップの可視範囲を限定します。

フロー・ダイアグラムに記述したレーンのIDはそれぞれ、EMPLOYEE(従業員)、MANAGER(上司)、VICE_PRESIDENT(部門長)、ACCOUNTANT(経理)です。

アプリケーション経費精算共有コンポーネントアプリケーション・アクセス制御を開き、レーンに対応するロールを作成します。


アプリケーション作成ウィザードによるアプリケーションの作成時に、機能としてアクセス制御を含めているので、コントリビュータリーダー管理者の3つのロールがあらかじめ作成されています。

ロールの追加をクリックします。


従業員のレーンに対応するロールを作成します。名前従業員静的識別子はレーンのIDであるEMPLOYEEを指定します。ロールの作成をクリックします。


同様の手順で、名前上司静的識別子MANAGERロールの作成を行います。


名前部門長静的識別子VICE_PRESIDENTロールの作成を行います。


名前経理静的識別子ACCOUNTANTロールの作成を行います。


アプリケーション・アクセス制御ロールの一覧より、4つのロールが作成されていることを確認します。


上司のロールが割り当てられているユーザーにのみ、上司によるレビューを待っている経費精算の申請が一覧されるように、レポートのSELECT文を変更します。

ページ・デザイナにてページ番号上司のページを開き、レポート1ソースSQL問合せを以下に変更します。

APEXの標準ビューAPEX_APPL_ACL_USER_ROLESの列ROLE_STATIC_ID(ユーザーに割り当てられたロールの静的識別子)とFlows for APEXが提供するビューFLOW_TASK_INBOX_VWの列SBFL_CURRENT_LANE(現在のタスクが配置されているレーン)を対象としてジョインします。結果として、レーンのIDと同じロールを持つユーザーだけに、レーン内の情報が一覧されます。


上記の変更を行なった後で、アプリケーションを実行し経費精算の申請を行ってみます。従業員の画面から作成をクリックします。


経費精算の申請を作成します。入力データはなんでも良いですが、Expe Amount - 金額については、50より大きい値を入れます。上司による承認後に部門長に申請が回ります。


経費精算の申請が作成されます。ステータスクリックして、ワークフローの進捗を確認します。


上司のレーンにある申請のレビューで、ワークフローが待機していることが確認できます。


ナビゲーション・メニューより上司をクリックし、上司の画面を表示します。承認待ちの経費精算の申請は表示されません。サインインしたユーザーにロール上司が割り当たっていないためです。


アプリケーションにサインインしたユーザーに、ロール上司を割り当てます。

ナビゲーション・メニューより管理を開き、ユーザーアクセス制御設定を変更します。


ロール上司を割り当てるユーザーの鉛筆アイコンクリックします。


上司チェックを入れ、変更の適用をクリックします。


ロールの追加を確認し、画面を閉じます。


再度、上司の画面を開きます。ロール上司が割り当てられたため、今度はレビュー待ちの経費精算の申請が表示されます。


つまり、フロー・ダイアグラムに配置されているタスクやゲートウェイは、それらが配置されているレーンの情報を持っていますが、そのレーンの情報の扱いはあくまでアプリケーション側で決められます。経費精算のアプリケーションでは、レーンをロールと見做しています。

同様の手順で部門長のレポートを変更します。ページ番号部門長のページを開き、ソースSQL問合せを以下に変更します。


レポートのソースとなるSELECT文の変更点は、上司のレポートのソースとまったく同じです。部門長へ回された経費精算の申請は、部門長のロールをもったユーザーにのみ表示されます。

経理のレポートも変更します。ページ番号経理のページを開き、対話グリッドのソースSQL問合せを以下に変更します。


経費精算のアプリケーションが提供するすべての機能にアクセスするには、以下のように上司、部門長、経理のロールが必要です。管理者のロールは管理画面にアクセスするために必要で、このロールがないとユーザーに上司、部門長、経理といったロールを割り当てることができなくなります。


従業員のロールは、今の所は経費精算のアプリケーションでは使用していません。ナビゲーション・メニューの従業員の画面で表示される申請は、そのユーザーが申請したすべての経費精算の申請であり、従業員のレーンに限定されません。

一覧を従業員のレーンに限定すると、タスク申請の修正で再申請待ちとなっている経費精算の申請だけが一覧の対象となります。


フロー・モデルに定義したレーンを、APEXアプリケーションとしてはロールとして扱うことにしても、それぞれのレーンごとに扱いは変わります。今回は、上司、部門長、経理についてはレーンとロールを紐づける形でデータの可視範囲を制限していますが、従業員のロールについては、そのような扱いはしていません。

フロー・ダイアグラムのレーンをAPEXアプリケーションで扱う方法についての説明は以上になります。まとめると、レーンの扱いはコードに依存する、ということになります。

ところで、ユーザーが以下のように従業員のロールだけを持っていたとします(管理者はロールの設定を変更するために必要で、経費精算の処理とは関係ありません)。


実行している経費精算のアプリケーションのナビゲーション・メニューは、以下のように表示されます。

ロールを定義しただけでは、経費精算のアプリケーションで使える機能に制限はかかりません。


ワークフローが持っている情報の制限とは別に、ユーザーに割り当てられたロールに従って、アプリケーションが提供する機能を制限します。

APEXアプリケーションでアクセス制限を実装するには、認可スキームを使用します。

共有コンポーネント認可スキームを開きます。


すでに作成済みの認可スキームの一覧が表示されます。管理権限リーダー権限コントリビューション権限があります。この内、管理権限コントリビューション権限が、ロールを元に作成されている認可スキームです(タイプロールまたはグループ内にある)。

ロールとして従業員上司部門長経理を作成しています。これらの作成済みのロールを使った認可スキームを作成します。作成をクリックします。


それほど難しい設定ではないので、認可スキームの作成には最初からを選びます。へ進みます。


認可スキームの作成の画面が開きます。名前従業員スキーム・タイプとしてロールまたはグループ内にあるを選択します。タイプアプリケーション・ロール名前従業員を選択します。

スキームの違反時に表示されるエラー・メッセージの指定には「従業員ではありません。」と入力します。必須項目なので、何某かのメッセージの入力が必要です。

認可スキームの検証として、ページ・ビューごとに1回を選択します。通常はセッションごとに1回で十分だと思います。今回作成しているアプリケーションは機能検証が目的です。ユーザーのロール割り当てを変更するごとにサインインをやり直し、認可スキームに反映させるのは手間なので、ページ・ビューごとに評価するようにしています。

以上を設定し、認可スキームの作成をクリックします。


同じ手順にて、認可スキーム上司、部門長、経理を作成します。上記の従業員の部分を上司、部門長、経理に変更します。

作成した4つの認可スキームは、以下のように一覧されます。


作成した認可スキームをナビゲーション・メニュー・エントリに設定します。

共有コンポーネントナビゲーション・メニューを開きます。


ナビゲーション・メニューを開きます。


ナビゲーション・メニューのエントリ、従業員上司部門長経理のそれぞれについて、認可スキームを設定します。

名前に一致する認可スキームを選択し終えたら、変更の適用をクリックします。


アプリケーションを実行すると、ユーザーに割り当てられたロールに依存して、ナビゲーション・メニューの表示が変わっていることが確認できます。


管理画面を開き、アクセス制御ユーザーより、ユーザーのロール割り当てを変更します。部門長を除いたロールにチェックを入れます。


アプリケーションの画面に戻ると、ナビゲーション・メニューとして部門長を除いたナビゲーションが表示されています。


実は、APEXアプリケーションのナビゲーションの非表示とアクセス制御は異なる設定です。

従業員のページを開いている状態では、ブラウザのURLは以下のようになっています。

https://ホスト名/パス/expenseclaim/従業員?session=セッションID

従業員の部分を部門長に書き換えてアクセスします。

https://ホスト名/パス/expenseclaim/部門長?session=セッションID

データは表示されませんが(これは部門長がレビューする申請の一覧には、ロールとして部門長が必要とされているようにSELECT文が変更済みであるため)、部門長による申請のレビュー画面にはアクセスできています

ページのアクセスを制限するには、ページ・プロパティセキュリティ認可スキームを設定する必要があります。

ページ・デザイナにてページ番号部門長のページを開き、セキュリティ認可スキームとして部門長を設定します。


ページの認可スキームが設定されていると、URLの書き換えによる直接アクセスであっても、ページの実行が拒否されます。


経費精算のアプリケーションとして、ページの認可スキームは以下のように設定します。
  • 従業員(ページ番号2)、経費精算の申請(ページ番号3) - 認可スキームは従業員
  • 上司(ページ番号4)、申請のレビュー(ページ番号5)- 認可スキームは上司
  • 部門長(ページ番号7)、申請のレビュー(ページ番号8) - 認可スキームは部門長
  • 経理(ページ番号6) - 認可スキームは経理
ページ一覧の画面にてレポート列に認可スキームを含めると、ページに設定されている認可スキームも含めて表示させることができます。


レーンとロールを使ったアクセス制御についての説明は以上になります。

ここまでの変更を適用したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/expenseclaim-v1.zip