経費精算のフロー・ダイアグラムを記述する際に、プールを4つのレーンに分割しています。4つのレーンはそれぞれ、従業員、上司、部門長、経理としています。これらをAPEXのアプリケーションのロールに対応させることにより、ワークフローに含まれるステップの可視範囲を限定します。
フロー・ダイアグラムに記述したレーンのIDはそれぞれ、EMPLOYEE(従業員)、MANAGER(上司)、VICE_PRESIDENT(部門長)、ACCOUNTANT(経理)です。
アプリケーション経費精算の共有コンポーネントのアプリケーション・アクセス制御を開き、レーンに対応するロールを作成します。
ロールの追加をクリックします。
従業員のレーンに対応するロールを作成します。名前は従業員、静的識別子はレーンのIDであるEMPLOYEEを指定します。ロールの作成をクリックします。
同様の手順で、名前が上司、静的識別子がMANAGERのロールの作成を行います。
名前が部門長、静的識別子がVICE_PRESIDENTのロールの作成を行います。
名前が経理、静的識別子がACCOUNTANTのロールの作成を行います。
アプリケーション・アクセス制御のロールの一覧より、4つのロールが作成されていることを確認します。
上司のロールが割り当てられているユーザーにのみ、上司によるレビューを待っている経費精算の申請が一覧されるように、レポートのSELECT文を変更します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
select | |
expe.expe_id | |
,expe.expe_justification | |
,expe.expe_amount | |
,expe.expe_status | |
,expe.expe_submitted_by | |
,expe.expe_submitted_on | |
,expe.expe_invoice_dd | |
,expe.expe_purpose | |
,tibx.link_text | |
,tibx.sbfl_prcs_id | |
,tibx.sbfl_step_key | |
from tuto_expenses expe | |
join flow_task_inbox_vw tibx on expe.expe_id = tibx.sbfl_business_ref | |
-- APEXのロールとF4Aのレーンの関連付け | |
join apex_appl_acl_user_roles aclr on tibx.sbfl_current_lane = aclr.role_static_id | |
where tibx.sbfl_dgrm_name = :APP_NAME | |
and expe.expe_status = 'submitted' -- 状態はF4Aが管理しているため、この条件は必須ではない | |
and tibx.sbfl_current = 'review_expense_mgr' | |
-- アサインされているロールを選択する | |
and aclr.application_id = :APP_ID | |
and aclr.user_name = :APP_USER |
ページ・デザイナにてページ番号4の上司のページを開き、レポート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より大きい値を入れます。上司による承認後に部門長に申請が回ります。
ナビゲーション・メニューより上司をクリックし、上司の画面を表示します。承認待ちの経費精算の申請は表示されません。サインインしたユーザーにロール上司が割り当たっていないためです。
アプリケーションにサインインしたユーザーに、ロール上司を割り当てます。
ナビゲーション・メニューより管理を開き、ユーザーのアクセス制御設定を変更します。
ロール上司を割り当てるユーザーの鉛筆アイコンをクリックします。
上司にチェックを入れ、変更の適用をクリックします。
ロールの追加を確認し、画面を閉じます。
つまり、フロー・ダイアグラムに配置されているタスクやゲートウェイは、それらが配置されているレーンの情報を持っていますが、そのレーンの情報の扱いはあくまでアプリケーション側で決められます。経費精算のアプリケーションでは、レーンをロールと見做しています。
同様の手順で部門長のレポートを変更します。ページ番号7の部門長のページを開き、ソースのSQL問合せを以下に変更します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
select | |
expe.expe_id | |
,expe.expe_justification | |
,expe.expe_amount | |
,expe.expe_status | |
,expe.expe_submitted_by | |
,expe.expe_submitted_on | |
,expe.expe_invoice_dd | |
,expe.expe_purpose | |
,tibx.link_text | |
,tibx.sbfl_prcs_id | |
,tibx.sbfl_step_key | |
from tuto_expenses expe | |
join flow_task_inbox_vw tibx on expe.expe_id = tibx.sbfl_business_ref | |
join apex_appl_acl_user_roles aclr on tibx.sbfl_current_lane = aclr.role_static_id | |
where tibx.sbfl_dgrm_name = :APP_NAME | |
and expe.expe_status = 'approved_by_mgr' -- 状態はF4Aで管理しているので、必須ではない。 | |
and tibx.sbfl_current = 'review_expense_vp' | |
and aclr.application_id = :APP_ID | |
and aclr.user_name = :APP_USER |
レポートのソースとなるSELECT文の変更点は、上司のレポートのソースとまったく同じです。部門長へ回された経費精算の申請は、部門長のロールをもったユーザーにのみ表示されます。
経理のレポートも変更します。ページ番号6の経理のページを開き、対話グリッドのソースのSQL問合せを以下に変更します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
select | |
expe.expe_id | |
,expe.expe_purpose | |
,expe.expe_amount | |
,expe.expe_submitted_by | |
,expe.expe_submitted_on | |
,expe.expe_invoice_dd | |
,expe.expe_account | |
,tibx.sbfl_prcs_id | |
,tibx.sbfl_id | |
,tibx.sbfl_step_key | |
from tuto_expenses expe | |
join flow_task_inbox_vw tibx on expe.expe_id = tibx.sbfl_business_ref | |
join apex_appl_acl_user_roles aclr on tibx.sbfl_current_lane = aclr.role_static_id | |
where tibx.sbfl_dgrm_name = :APP_NAME | |
and tibx.sbfl_current = 'prepare_payment' | |
and aclr.application_id = :APP_ID | |
and aclr.user_name = :APP_USER |
経費精算のアプリケーションが提供するすべての機能にアクセスするには、以下のように上司、部門長、経理のロールが必要です。管理者のロールは管理画面にアクセスするために必要で、このロールがないとユーザーに上司、部門長、経理といったロールを割り当てることができなくなります。
従業員のロールは、今の所は経費精算のアプリケーションでは使用していません。ナビゲーション・メニューの従業員の画面で表示される申請は、そのユーザーが申請したすべての経費精算の申請であり、従業員のレーンに限定されません。
一覧を従業員のレーンに限定すると、タスク申請の修正で再申請待ちとなっている経費精算の申請だけが一覧の対象となります。
フロー・モデルに定義したレーンを、APEXアプリケーションとしてはロールとして扱うことにしても、それぞれのレーンごとに扱いは変わります。今回は、上司、部門長、経理についてはレーンとロールを紐づける形でデータの可視範囲を制限していますが、従業員のロールについては、そのような扱いはしていません。
フロー・ダイアグラムのレーンをAPEXアプリケーションで扱う方法についての説明は以上になります。まとめると、レーンの扱いはコードに依存する、ということになります。
ところで、ユーザーが以下のように従業員のロールだけを持っていたとします(管理者はロールの設定を変更するために必要で、経費精算の処理とは関係ありません)。
実行している経費精算のアプリケーションのナビゲーション・メニューは、以下のように表示されます。
ロールを定義しただけでは、経費精算のアプリケーションで使える機能に制限はかかりません。
ワークフローが持っている情報の制限とは別に、ユーザーに割り当てられたロールに従って、アプリケーションが提供する機能を制限します。
APEXアプリケーションでアクセス制限を実装するには、認可スキームを使用します。
共有コンポーネントの認可スキームを開きます。
すでに作成済みの認可スキームの一覧が表示されます。管理権限、リーダー権限、コントリビューション権限があります。この内、管理権限とコントリビューション権限が、ロールを元に作成されている認可スキームです(タイプがロールまたはグループ内にある)。
ロールとして従業員、上司、部門長、経理を作成しています。これらの作成済みのロールを使った認可スキームを作成します。作成をクリックします。
それほど難しい設定ではないので、認可スキームの作成には最初からを選びます。次へ進みます。
スキームの違反時に表示されるエラー・メッセージの指定には「従業員ではありません。」と入力します。必須項目なので、何某かのメッセージの入力が必要です。
認可スキームの検証として、ページ・ビューごとに1回を選択します。通常はセッションごとに1回で十分だと思います。今回作成しているアプリケーションは機能検証が目的です。ユーザーのロール割り当てを変更するごとにサインインをやり直し、認可スキームに反映させるのは手間なので、ページ・ビューごとに評価するようにしています。
以上を設定し、認可スキームの作成をクリックします。
同じ手順にて、認可スキーム上司、部門長、経理を作成します。上記の従業員の部分を上司、部門長、経理に変更します。
作成した4つの認可スキームは、以下のように一覧されます。
作成した認可スキームをナビゲーション・メニュー・エントリに設定します。
共有コンポーネントのナビゲーション・メニューを開きます。
ナビゲーション・メニューを開きます。
ナビゲーション・メニューのエントリ、従業員、上司、部門長、経理のそれぞれについて、認可スキームを設定します。
名前に一致する認可スキームを選択し終えたら、変更の適用をクリックします。
アプリケーションを実行すると、ユーザーに割り当てられたロールに依存して、ナビゲーション・メニューの表示が変わっていることが確認できます。
アプリケーションの画面に戻ると、ナビゲーション・メニューとして部門長を除いたナビゲーションが表示されています。
実は、APEXアプリケーションのナビゲーションの非表示とアクセス制御は異なる設定です。
従業員のページを開いている状態では、ブラウザのURLは以下のようになっています。
https://ホスト名/パス/expenseclaim/従業員?session=セッションID
従業員の部分を部門長に書き換えてアクセスします。
https://ホスト名/パス/expenseclaim/部門長?session=セッションID
データは表示されませんが(これは部門長がレビューする申請の一覧には、ロールとして部門長が必要とされているようにSELECT文が変更済みであるため)、部門長による申請のレビュー画面にはアクセスできています。
ページのアクセスを制限するには、ページ・プロパティのセキュリティの認可スキームを設定する必要があります。
ページ・デザイナにてページ番号7の部門長のページを開き、セキュリティの認可スキームとして部門長を設定します。
ページの認可スキームが設定されていると、URLの書き換えによる直接アクセスであっても、ページの実行が拒否されます。
経費精算のアプリケーションとして、ページの認可スキームは以下のように設定します。
- 従業員(ページ番号2)、経費精算の申請(ページ番号3) - 認可スキームは従業員
- 上司(ページ番号4)、申請のレビュー(ページ番号5)- 認可スキームは上司
- 部門長(ページ番号7)、申請のレビュー(ページ番号8) - 認可スキームは部門長
- 経理(ページ番号6) - 認可スキームは経理
ページ一覧の画面にてレポート列に認可スキームを含めると、ページに設定されている認可スキームも含めて表示させることができます。
レーンとロールを使ったアクセス制御についての説明は以上になります。
ここまでの変更を適用したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/expenseclaim-v1.zip