Настраиваем доступ к web приложению на основе ролей Yii 2. Часть 1. Общие механизмы работы

Реализовать разграничение доступа на основе ролей (RBAC — Role Based Access Control) можно различными способами. В случае Yii 2 это проще всего сделать при помощи стандартного модуля RBAC.

В Yii 2 поддерживается несколько реализаций RBAC. В данной статье мы будем использовать наиболее распространённый вариант, в котором для хранения сведений о ролях используется база данных.

В этой статье предполагается, что в приложении уже имеется класс модели для пользователей (identity class) и соответствующая ему таблица в базе данных.
Подключение и создание таблиц в базе данных

Для подключения модуля RBAC необходимо внести изменения в два файла в папке config.

В web.php в разделе components нужно прописать следующее:

Аналогичная информация вносится в файл console.php.

Последнее необходимо для того, чтобы впоследствии можно было в консоли выполнить инициализацию ролей и их привязку к пользователям.

После этого выполняем в консоли команду, которая выполнит уже приготовленные миграции для создания служебных таблиц модуля RBAC.

Основные операции с ролями

Для работы с ролями в модуле RBAC осуществляется при помощи объекта AuthManager, доступ к которому можно получить следующим образом:

Для того, чтобы создать роль необходимо воспользоваться методом createRole и затем сохранить созданную роль в базе данных при помощи метода add. Ниже показан пример создания роли с добавлением её описания.

Для получения ранее созданной роли используется метод getRole. А, для её назначения пользователю, метод assign.

Пример добавления роли пользователю:

Для того, чтобы удалить у пользователя отдельную роль или все роли используются методы revoke и revokeAll соответственно.

Пример использования revoke:

Пример использования revokeAll:

Если нужно полностью удалить роль или все роли вообще из базы данных, то применяются методы remove и removeAll соответственно.

Перед удалением ролей из базы данных следует убедиться, что роли не назначены ни одному из пользователей.

Пример использования remove:

Пример использования removeAll:

Инициализация

Теперь, можно приступить к написанию инициализации.

Инициализация ролей необходима для того, чтобы назначить роли пользователям перед использованием приложения для работы с ним.

Для этого в папке commands создадим контроллер (для примера назовём его RbacController), который будет содержать код инициализации и при помощи которого она будет запускаться.

Напомним, что в папке commands содержатся части приложения доступные для выполнения из консоли.

По существу, нам необходимо создать один метод действие в вышеуказанном контроллере и разместить в нём сперва создание всех ролей, а затем их назначение пользователям.

Так как эти операции были рассмотрены нами ранее, приведём только результат в виде готового кода.

Для того чтобы запустить инициализацию следует выполнить в консоли команду:

Если в вашем случае название контроллера или его метода действия отличаются от тех, что приведены в статье, необходимо до и после символа «/» указать соответствующие имена.

Назначение прав доступа к разделам web приложения

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

В рамках стандартного модуля RBAC для этого используется фильтр контроля доступа (Access Control Filter (ACF)).

Чтобы его задействовать в массиве, который возвращает метод behaviors контроллера нужно добавить элемент «access».

В нём мы указываем класс ACF (раздел «class») и правила доступа к контроллеру в целом или его отдельным методам действия (раздел «rules»).

В данном примере разрешается доступ к любым действиям контроллера разрешается только для роли «admin».

Раздел «denyCallback» определяет действия, которые выполняются если у пользователя нет прав доступа к данному разделу web приложения или действию контроллера. В данном примере такой пользователь просто перенаправляется на страницу входа.

Если раздел «denyCallback» отсутствует, то будет вызвана ошибка HTTP 403.

Если необходимо задать разрешения для отдельных методов действия, то для них следует задать отдельные правила, как это показано ниже.

Проверка прав доступа в коде

Нередко возникает необходимость проверить наличие у пользователя cсоответствующих прав непосредственно в коде. Например, при формировании меню (выводить или нет те или иные пункты).

Для таких случаев у глобального объекта user есть метод can, который принимает в качестве параметра имя роли. Если текущему пользователю назначена эта роль метод возвратит true.

Ниже показан фрагмент отображения web интерфейса для двух ролей. Если пользователь не относится ни к администраторам, ни к менеджерам данный набор кнопок для него отображаться не будет.

Заключение

Работа с RBAC в Yii 2 организована достаточно сложно. В частности, помимо ролей существуют разрешения, роли могут наследоваться друг от друга (разрешения тоже) и т.д.

В данной статье нами рассмотрены лишь самые общие механизмы работы с RBAC, без которых не обходится почти любое web приложение.

В дальнейшем мы будет расширять и углублять свои познания в данной области по мере написания новых статей.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *