こちらの記事の継続です。
対話モード・レポートとフォームの追加
アプリケーションに対話モード・レポートとフォームのページを追加します。アプリケーション・ビルダーからページの作成を実行します。
ページ・タイプがコンポーネントに含まれるフォームをクリックします。
フォーム付きレポートをクリックします。
レポート・タイプとして対話モード・レポートを選択します。レポート・ページ名とフォーム・ページ名は任意ですが、それぞれ、タスク一覧、タスク編集とします。フォーム・ページ・モードとしてモーダル・ダイアログを選択します。次へ進みます。
それ以外はデフォルトの設定とします。データ・ソースはローカル・データベース、ソース・タイプは表です。レポートの表示する列はすべてを選択します。次へ進みます。
LOVの表示値と戻り値のセットを登録します。表示値はOpen, Closed, Pending, On-Holdの4つを登録し、それぞれの戻り値としてOPEN, CLOSED, PENDING, ON-HOLDを設定します。LOVの作成をクリックします。
対話モード・レポートのアクセス制限
select PROJECT_ID,
TASK_ID,
TASK_NAME,
ASSIGNED_TO,
STATUS,
START_DATE,
END_DATE,
COST,
BUDGET,
e.GROUP_NAME
from PAC_TASKS t join PAC_EMPLOYEES e
on t.assigned_to = e.employee_id
where :G_IS_ADMINISTRATOR = 'Y'
or
e.GROUP_NAME = :G_GROUP_NAME
このSQLを対話モード・レポートに設定します。
ページ・デザイナにてタスク一覧のページを開き、レポートのリージョンを選択し、ソースのタイプをSQL問合せに変更し、上記のSQLを設定します。
変更した結果を確認するため、タスク一覧のページを実行します。一般従業員(管理者およびコントリビュータ・ロールを持たない)でサインインします。
サインインした従業員が所属している部門のタスクのみがリストされていることは確認できますが、今回の要件では、一般従業員はタスクを作成する権限がなく、また、自分が担当していないタスクの編集権限もありません。
対話モード・レポートにはフォームを開くためのコンポーネントがあり、これらを制御する必要があります。
select
case
when
(
:G_IS_CONTRIBUTOR = 'Y'
and
e.group_name = :G_GROUP_NAME
)
or
(
:G_IS_CONTRIBUTOR = 'N'
and
e.employee_name = :APP_USER
)
then
'<a href="' || apex_page.get_url(p_page => 8, p_items => 'P8_TASK_ID', p_values => task_id)
|| '"><span class="fa fa-edit" aria-hidden="true" title="編集"></span>'
else
''
end edit_link,
PROJECT_ID,
TASK_ID,
TASK_NAME,
ASSIGNED_TO,
STATUS,
START_DATE,
END_DATE,
COST,
BUDGET,
e.group_name
from PAC_TASKS t join PAC_EMPLOYEES e
on t.assigned_to = e.employee_id
where
:G_IS_ADMINISTRATOR = 'Y'
or
e.group_name = :G_GROUP_NAME
コントリビュータ・ロールを持っている場合は、所属している部門が一致していれば編集リンクを生成し、持っていない場合は担当者がサインインした従業員であれば編集リンクを生成するように記述されています。
新規に追加された列EDIT_LINKはHTMLのタグを含むので、列のプロパティの特殊文字をエスケープをOFFにする必要があります。
Oracle APEXではクロスサイト・スクリプティング(XSS)攻撃を防ぐため、ページへの出力に含まれる特殊文字は常にエスケープされます。HTMLの出力をブラウザにHTMLとして解釈させるには、この特殊文字をエスケープをOFFにする必要があります。
以上の設定で、対話モード・レポートを確認します。
一般従業員でサインインし、担当者が自分自身のタスクに編集リンクがあることを確認します。
コントリビュータ・ロールを持つ従業員でも確認します。作成ボタンも表示されていることが確認できます。
対話モード・レポートへのアクセス制御の実装は以上で完了です。
フォームのアクセス制限
Oracle APEXでは、ページのナビゲーションを辿らずにフォームを開くことができないように、ページが保護されています。この保護機能(ディープ・リンクやページ・アクセスの保護)はデフォルトで有効なので、これらの保護を解除しないかぎりデータの編集フォームを直接開くことはできません。(ページの保護についてはこちらの記事を書いています)。
そのため、必ずしもフォームに認可スキームを設定する必要がない場合が多いです。また、認可スキームでは対応ができないケースもあります。
例えば、タスク編集のページの認可スキームを、以下のようにコントリビューション権限に変更したとします。
結果として、一般従業員による自分が担当者であるタスクの編集が制限されてしまいます。どのようなエラーが発生するかは、ファセット検索の記事ですでに紹介していますので、実際に認可スキームを設定して確認しなくてもよいでしょう。
同様に実際にデータベース操作を行うプロセスにも、認可スキームを設定できます。タスク編集の画面の左ペインにあるプロセス・ビューを開き、プロセス・フォームタスク編集を選択します。認可スキームをコントリビューション権限に変更します。
この設定だと、一般従業員による自分自身が担当者であるタスクの編集が禁止されてしまいます。どのような動作になるか確認してみましょう。
何も起こらないのでスクリーンショットは省略します。
エラーは発生しませんが、値を変更して変更の適用をクリックしても、変更は一切反映されないことが確認できます。ボタンなどの画面上に表示されるコンポーネントと同様に、認可スキームで許可されないと、プロセスが存在しないと解釈され、実行がスキップされます。
これからの作業に支障があるので、プロセスに設定した認可スキームは解除しておきます。
それぞれのユーザーがフォームにてタスクの情報を更新するにあたって、以下の2つの制限を適用します。
- 一般従業員がタスクを編集する際に、担当者(ASSIGNED_TO)は自分自身から変更できない。
- コントリビュータは自部門の従業員しか担当者(ASSIGNED_TO)に指定できない。
フォームを開いて効果を確認します。一般従業員でサインインしフォームを開くと、Assigned Toのページ・アイテムが表示されていないことが確認できます。











































