Як налаштувати посторінкову авторизацію в oracle apex

При розробці додатків в APEX часто потрібні різні рівні доступу для користувачів - наприклад, коли додатком користуються користувачі з різних підрозділів, або коли потрібно створити звіти, видимі тільки адмінам.

Аутентифікація знаходиться за рамками даної статті, але про неї вже є хороший матеріал.

Розглянемо для прикладу додаток, в якому є два звіти - Admin Report і User Report і пользователі- ADMIN, USER1 і USER2.

Потрібно зробити так, щоб ADMIN бачив всі сторінки, а USER'и не бачив Admin Report.

1. Визначення рольової моделі

Для початку, потрібно визначитися, як буде виглядати рольова модель: для невеликих додатків має сенс визначати список доступних сторінок безпосередньо для кожного користувача, але якщо в додатку багато сторінок або користувачів, зручніше буде ввести ролі і зробити дві зв'язки "користувач -> роль" і "роль -> сторінка", тобто кожному користувачеві привласнити роль, і для кожної ролі налаштувати доступ до певних сторінок.

Ми підемо іншим шляхом, так як очікуємо, що в наслідок число користувачів зросте.

Введемо дві ролі ADMIN і USER і створимо таблицю USER_ROLE

і таблицю ROLE_PAGE

Як бачимо, для ролі USER не вказано доступ до сторінки 2.

Номери сторінок можна подивитися в Application Builder в APEX або через уявлення APEX в БД:

select *
from APEX_APPLICATION_PAGES
where APPLICATION_ID = <номер вашего приложения>

Тепер напишемо функцію, приймаючу на вхід ім'я користувача і сторінку додатка повертає логічне значення, чи є доступ у даного користувача для даної сторінки.

Тепер потрібно вибрати створену схему для цього додатка. Для цього йдемо в Shared components -> User Interface Attributes (блок User Interface). У розділі Security -> Authorization вибираємо створену схему і тиснемо "Apply Changes".

Тепер при спробі USER1 і USER2 подивитися Admin Report вони будуть бачити наступне:

4. Зміна навігаційного меню (Navigation Menu)

Можна залишити і таку реалізацію, але краще приховати від користувачів з меню ті сторінки, на які вони все одно не можуть перейти.

Для того, щоб користувачі бачили навігаційне меню в залежності від свого рівня доступу потрібно перейти від статичного навігаційного меню за замовчуванням до динамічного.

Сенс в тому, щоб взяти об'єкти статичного меню (зазвичай називається 'Desktop Navigation Menu'), подивитися, з якими сторінками пов'язані його об'єкти, і з використанням створеної рольової моделі, показувати користувачеві тільки ті List Entries, які пов'язані з доступними йому сторінками.

Скористаємося APEX поданням (view) APEX_APPLICATION_LIST_ENTRIES, в якому є інформація, які сторінки прикріплені до яких об'єктів навігації. Для того, щоб не підтримувати окремо ще одну таблицю зі зв'язком Роль -> Об'єкт навігації, створимо уявлення, що зв'язує ролі і List Entries на основі зв'язку Роль -> Сторінка:

SET DEFINE OFF;
CREATE OR REPLACE EDITIONABLE VIEW ROLE_LIST_ENTRY ( "USER_ROLE". "LIST_ENTRY_ID") AS
select distinct p.user_role, l.list_entry_id
from apex_application_list_entries l
join role_page p on l.entry_target like'f? p = APP_ID .: '|| p.page_id || ':% SESSION%' or entry_target is null
where l.list_name = 'Desktop Navigation Menu'
and l.application_id = <номер вашего приложения> ;

Якщо зробити select зі створеного уявлення, то можна побачити, що для ролі ADMIN доступні 3 list entry, а для USER - тільки 2:

Прийшов час зробити динамічне навігаційне меню. Для цього в Shared Components -> Navigation Menu створюємо нове меню: вибираємо "From scratch" і Dynamic, в вікно, що з'явилося SQL запиту вписуємо наступне:

select level. al.entry_text label. al.entry_target

from apex_application_list_entries al

join ROLE_LIST_ENTRY rl on al.list_entry_id = rl.list_entry_id

join USER_ROLE ur on ur.user_role = rl.user_role and upper (ur.user_name) = upper (: APP_USER)

al.LIST_NAME = 'Desktop Navigation Menu'

and al.application_id = <номер вашего приложения>

start with al.list_entry_parent_id is null

connect by prior al.list_entry_id = al.list_entry_parent_id

order siblings by al.display_sequence

Тепер потрібно вибрати Динамічне навігаційне меню для нашого інтерфейсу. Для цього знову переходимо в Shared Components -> User Interface Attributes. У розділі User Interface натискаємо на значок редагування поточного інтерфейсу і потрапляємо в User Interface Details. У вкладці Navigation Menu вибираємо створене нами меню і тиснемо "Apply Changes"

Тепер USER1 і USER2 при вході в додаток не бачитимуть в меню навігації Audit Report:

Інші статті на тему APEX:

Увійти через соцмережу