はじめに
Identity Domainと認証連携したAPEXアプリケーションで、ログインするIAMユーザーのグループとアプリケーション・ロールによって表示を制御することと試してみます。
前提
- Autonomous AI Databaseに付属するAPEXを利用
- IAMユーザは以下の通り
- test_user1、test_admin1の2ユーザーを作成
- どちらもグループAPEX_GROUPに所属
- test_admin1はグループDomain_Administratorsに所属
- test_admin1はアプリケーションロールService Administrator、test_user1はアプリケーションロールServiceViewerが付与されている(これらのロールについてはユーザーにOACの利用を許可するを参考にしてください)
1.ADBの作成とAPEXアプリケーションの作成
ADB-Sを作成し、APEXでアプリケーションを作成します。
ワークスペースを作成後、ワークスぺースにワークスペース管理者でログイン、
SQLワークショップのユーティリティ→サンプル・データセットでEMP/DEPTをインス
トール、そのあと続けてアプリケーションの作成でデモアプリケーションを作成しました。

2.APEXアプリケーションのIdentity Domainとの認証連携
こちらの資料の2.Identity Domains側での設定(APEXアプリケーションとの認証連携設定)と4.APEX側での設定を行います。
IAMユーザの認証でアプリケーションにアクセスできるようになりました。
3.Identity Domainのグループ情報の取得
3と4も拡張編:グループによるアクセス制御とほぼ同じです。
アプリケーションの共有コンポーネントにある認証スキームから、2で作成した認証スキーム”IdentityDomain_Auth"を選択します。有効範囲にgroupsを追加し、追加ユーザー属性にgroupsを入力します。
ソースにPL/SQLコードを入力します。
入力したコードはこちらです。
procedure load_dynamic_groups as
l_group_names apex_t_varchar2;
Begin
--
-- add all group name to l_group_names
--
For I in 1..apex_json.get_count('groups') loop
apex_string.push(
p_table=> l_group_names,
p_value => apex_json.get_varchar2(
p_path=> 'groups[%d].name',
p0 => i));
end loop;
--
-- save group name in session
--
apex_authorization.enable_dynamic_groups(
p_group_names => l_group_names);
end;
ログイン・プロセスにコードに記述しているプロシージャload_dyanamic_groupsを設定します。
4.認可スキームの変更
アプリケーション定義の編集を選択し、上部のメニューからセキュリティを選択します。認可にあるロールまたはグループ・スキームのソースにカスタム・コードを設定し、変更の適用をクリックします。
5.管理者を判定する認可スキームを作成
管理者だけ表示を変更したいと思います。
アプリケーションの共有コンポーネントから認可スキームを選択し、作成をクリックします。
最初からを選択し、APEXデモ管理者という名前で認可スキームを作成します。
スキーム・タイプはプールを戻すPL/SQLファンクションにして、グループがAPEX_GROUPかつServiceAdministratorのときだけTRUEとなるファンクションのコードを書きました。
入力したコードはこちらです。
declare
cnt_1 NUMBER := 0;
cnt_2 NUMBER := 0;
begin
select count(*) into cnt_1 from apex_workspace_session_groups where apex_session_id=:app_session and group_name='APEX_GROUP';
select count(*) into cnt_2 from apex_workspace_session_groups where apex_session_id=:app_session and group_name = 't6ykzgamihyonmu5j6sygyp3nryz7gba.ServiceAdministrator';
RETURN (cnt_1 > 0 AND cnt_2 > 0);
end;
6.アプリケーションの表示を編集
ナビゲーションメニューの”管理”を管理者だけに表示させます。
共有コンポーネントにあるナビゲーション・メニューから、リスト”ナビゲーション・メニュー”を選択します。
表示されているリスト・エントリから管理をクリックします。
上のメニューから認可を選択し、認可スキームに作成したAPEXデモ管理者を設定します。
7.動作確認
test_user1でアクセスし、ログインします。ナビゲーションメニューの管理は表示されません。
test_admin1でアクセスし、ログインすると、管理は表示されます。
8.ADBで情報を確認してみる
ユーザーのセッション情報は特別なAPEXビュー APEX_WORKSPACE_SESSION_GROUPSに保存されています。別途ADMINユーザーでADBにログインしてビューを確認してみました。
GROUP_NAMEに取得されたグループ情報が入っています。
SQL> select * from apex_workspace_session_groups;
WORKSPACE_ID WORKSPACE_NAME WORKSPACE_DISPLAY_NAME APEX_SESSION_ID USER_NAME GROUP_NAME
---------------- -------------- ---------------------- --------------- -------------------------------------------- -----------------------------------------------------
8122105399789462 APEXDEV APEXDEV 104032176498654 test_admin1 (IdentityDomain_Auth) APEX_GROUP
8122105399789462 APEXDEV APEXDEV 104032176498654 test_admin1 (IdentityDomain_Auth) Domain_Administrators
8122105399789462 APEXDEV APEXDEV 104032176498654 test_admin1 (IdentityDomain_Auth) t6ykzgamihyonmu5j6sygyp3nryz7gba.ServiceAdministrator
8122105399789462 APEXDEV APEXDEV 104939438030735 test_user1 (IdentityDomain_Auth) APEX_GROUP
8122105399789462 APEXDEV APEXDEV 104939438030735 test_user1 (IdentityDomain_Auth) t6ykzgamihyonmu5j6sygyp3nryz7gba.ServiceViewer
おわりに
グループごとで表示を変えたいという要望はよくあると思います。APEXアプリケーションでは各コンポーネントでセキュリティの中に認可スキームが基本的に用意されていますので、制御することができると思います。











