В большинстве приложений существует необходимость контроля доступа, в зависимости от роли пользователя. В данном уроке мы рассмотрим пример настройки такого контроля для веб-приложения. В рамках этой задачи необходимо будет:
- Определить роль пользователя
- В зависимости от роли, управлять отображением пунктов меню навигации.
- Сделать невозможным переход на страницы, доступ к которым закрыт для определенной роли.
Начальная подготовка
Начнем с подготовительной части. Для удобства дальнейшей настройки необходимо создать глобальную переменную, в которой будет хранится информация о текущем пользователе. Таким образом, при необходимости сделать проверку, не нужно будет каждый раз обращаться к бэкенду и запрашивать информацию о пользователе. Достаточно будет прочитать необходимые данные из глобальной переменной.
Необходимо учесть различные варианты, которыми авторизованный пользователь может попасть в приложение:
- Вход в результате успешной авторизации на странице Login.
- Вход в результате регистрации.
- Прямой вход по ссылке на определенную страницу для пользователей, которые уже авторизованы.
В каждом из этих случаев используется запрос к бэкенду, который возвращает информацию о пользователе. В соответствующем бизнес-процессе необходимо лишь добавить блок Set Variable для записи глобальной переменной User_gv, которую создали ранее.
Для авторизованных пользователей данный блок добавляется в бизнес-процесс CheckAuth, который находится в папке Prebuilt в разделе бизнес-процессов.
Для входа через страницы авторизации или регистрации, блок добавляется в бизнес-процессы соответствующих кнопок.
Проверим результат на стартовой странице приложения. Для этого добавим Label, который будет приветствовать пользователя по имени и, в зависимости от роли, будет писать, является он администратором или нет.
Нужно настроить бизнес-процесс, который срабатывает при любом отображении Label (триггер Label onShow).
- Expand User. Для получения информации об имени и ролях пользователя.
- In Array. Для проверки состоит ли данный пользователь в группе Admins.
- If-Else. Для вариативности действий в зависимости от результатов проверки.
- Set Variable (String). Для создания переменной String со значением “NOT ”, если пользователь не состоит в группе Admins, либо пустым значением, если состоит.
- Concat Strings (Multiple). Для создания полной фразы наподобие “Hi, Ken. You are NOT Admin”.
- Label Update Properties. Для итогового отображения данной фразы на странице.
Если все сделано правильно, то при любом варианте входа на страницу на экране будет подобный результат.
Управление видимостью пунктов меню
Теперь самое время перейти к основной части. Создадим страницу предназначенную только для Администраторов и добавим соответствующий пункт меню (Admin Page) для перехода на нее. Наилучшим решением будет отключить ее видимость по умолчанию.
С использованием блока Navigate необходимо выбрать созданную страницу в параметре Page и узнать ID данной страницы.
В данном примере страница с ограниченным доступом только одна, но лучше сразу предусмотреть вариант, когда подобных страниц может быть множество и создать глобальную переменную, предназначенную только для чтения, для хранения списка страниц.
Далее необходимо создать сам бизнес-процесс (назовем его Set NavItem Visibility) для управления видимостью пунктов меню навигации.
- Expand User. Для получения информации о ролях пользователя.
- In Array. Для проверки состоит ли данный пользователь в группе Admins.
- For each loop. Для запуска цикла для всех страниц, указанных в глобальной переменной.
- NavItem Update Properties. Для управления видимостью элемента, в зависимости от того, является ли пользователь администратором.
Блок созданного бизнес-процесса необходимо добавить перед переходом на домашнюю страницу в бизнес-процессах кнопок логина и регистрации пользователей (ранее в них же добавляли блоки Set Variable для записи переменной с информацией о текущем пользователе).
Контроль доступа по прямой ссылке
Последнее, что необходимо сделать - настроить бизнес-процесс, который выполняется при каждом запуске приложения по триггеру “On app launch”. Для пользователей прошедших аутентификацию, как и на предыдущем шаге, добавим блок Set NavItems Visibility.
Помимо этого нужно предусмотреть защиту от доступа на закрытую страницу по прямой ссылке:
- In Array (Admin_pages). Для проверки входит ли целевая страница в список страниц, предназначенных только для администраторов.
- If-Else. Для вариативности действий в зависимости от результатов проверки. В случае False можно выполнить навигацию на указанную страницу. В случае True нужна дополнительная проверка на право доступа к данной странице.
- Expand User. Для чтения информации о пользователе из глобальной переменной User_gv.
- In Array. Для проверки принадлежности к группе Admins.
- If-Else. Для выбора действий в зависимости от наличия прав администратора или их отсутствия.
- Navigate. Для перехода на необходимую страницу, либо для перенаправления на стартовую страницу в том случае, если пользователь без соответствующих прав пытается открыть страницу предназначенную только для администраторов.
Готово! Теперь выбранные страницы защищены от несанкционированного доступа. При отсутствии прав они не отображаются в меню и на них нельзя перейти даже по прямой ссылке.
Важно помнить тот факт, что защита доступа к определенным страницам не означает автоматическую защиту для эндпойнтов, которые могут использоваться на данных страницах. Для этого, при соответствующей необходимости, в настройках Middleware Token Auth, нужно указать группы пользователей, которые имеют права доступа к выбранному эндпойнту.