При розробці додатків в 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:
Увійти через соцмережу