У меня есть контроллер, который строит дерево ролей, прав доступа "с нуля". В том, чтобы написать такой, ничего сложного нет, если вы уже разобрались, как работает RBAC и продумали дерево ролей. Все примеры и необходимая информация есть в документации и в исходном коде.
Все операции выполняются через компонент Yii::$app->authManager.
Привязка.
Главная проблема, как сохранить привязку ролей и разрешений к пользователям. Тот самый "assignments". Ведь роли могут меняться очень сильно. Пока у меня небольшой проект, и ролей, назначенных "вручную", немного, я могу обойтись конфигом, в котором перечисляю логины пользователей и их привязку к ролям.
Код: Выделить всё
return [
'developer' => [
'super-developer@developer.ru',
],
'administrator' => [
'mega-administrator@administrator.ru',
'gendirektor@mail.ru',
],
'moderator' => [
'ultra-moderator@moderator.ru',
],
];
Но это, конечно, неудобно. Поэтому я решил использовать такую концепцию:
Пользовательские группы.
На сайте пользователи, как правило, делятся на несколько групп. Например, "разработчики", "администраторы", "модераторы", "зарегистрированные пользователи". Поэтому можно определить для каждой такой группы по одной роли, и хранить принадлежность к группе в таблице пользователей дополнительным полем, ну или связанной таблице.
Таким образом, консольный контроллер при очередном сбросе ролей сбрасывает все привязки к ролям, но не сбрасывает привязку пользователей к группам. А потом по этим группам привязывает соответствующие роли.
Модуль для управления группами я пока ещё не сделал. Поэтому похвастаться нечем )
Расширения.
Есть и другие решения, в нескольких расширениях Yii. Они сводятся к трём подходам:
1. Дополнительное хранение привязки роли к пользователю отдельным полем (аналогично описанным мной группам)
2. Миграции в том или ином виде. (
https://github.com/rmrevin/yii2-rbac-migration )
3. Автоматическое обновление привязки, основываясь на старой информации о привязке и новом дереве ролей. (
https://github.com/rmrevin/yii2-rbac-command )
Миграции я не использую, потому что мне, разработчику, будет очень сложно впоследствии разобрать структуру дерева ролей. Когда дерево строится с нуля, это довольно наглядно отображено прямо в коде. Но с миграциями уже сложнее - нужно смотреть по всем миграциям, что менялось, либо вести описание дерева отдельно, и постоянно обновлять.
Автоматическое обновление заманчиво, но я предпочту группы, потому что с группами я могу упростить администрирование для конечного пользователя. Админу не будет нужно ничего знать о ролях и правах доступа. Он просто будет выбирать группу для пользователя.