Yii2: Управление пользователями RBAC

yii2 rbac и управление пользователямиВо многих приложениях проблема управления пользователями стоит чуть ли не на первом месте и поэтому в php-фреймворк yii2 включена поддержка управления правами доступа на основе ролей. Но собрать весь имеющийся функционал воедино и дописать недостающие функции — далеко не всегда будет легко и быстро. Здесь на помощь приходит расширение webvimark/module-user-management, имеющее следующие возможности:

  • Управление пользователями;
  • RBAC (роли, разрешения и прочее) с веб-интерфейсом;
  • Регистрация, авторизация, восстановление пароля;
  • Логи посещений;
  • Хорошая оптимизация (0 запросов к базе данных при обычном рабочем процессе);
  • Удобные виджеты, например GhostMenu или GhostHtml::a, которые отображаются только если у пользователя есть соответствующие права.

Установка

Установка не представляет из себя ничего не обычного, она описана в документации расширения. Читать подробнее об установке расширений в yii2.

Настройка

Первый шаг

Добавляем компонент и модуль в файле config/web.php:

'components'=>[
    'user' => [
        'class' => 'webvimark\modules\UserManagement\components\UserConfig',

        // Comment this if you don't want to record user logins
        'on afterLogin' => function($event) {
                \webvimark\modules\UserManagement\models\UserVisitLog::newVisitor($event->identity->id);
            }
    ],
],

'modules'=>[
    'user-management' => [
        'class' => 'webvimark\modules\UserManagement\UserManagementModule',

        // Here you can set your handler to change layout for any controller or action
        // Tip: you can use this event in any module
        'on beforeAction'=>function(yii\base\ActionEvent $event) {
                if ( $event->action->uniqueId == 'user-management/auth/login' )
                {
                    $event->action->controller->layout = 'loginLayout.php';
                };
            },
    ],
],

Второй шаг

Для функционирования миграции в консоли, добавим соответствующий модуль в файле config/console.php:

'modules'=>[
    'user-management' => [
        'class' => 'webvimark\modules\UserManagement\UserManagementModule',
    ],
],

Третий шаг

Запускаем миграцию:

./yii migrate --migrationPath=vendor/webvimark/module-user-management/migrations/

Четвертый шаг

Добавляем поведение в основной контроллер:

public function behaviors()
{
    return [
        'ghost-access'=> [
            'class' => 'webvimark\modules\UserManagement\components\GhostAccessControl',
        ],
    ];
}

Возможные действия

<?php
use webvimark\modules\UserManagement\components\GhostMenu;
use webvimark\modules\UserManagement\UserManagementModule;

echo GhostMenu::widget([
    'encodeLabels'=>false,
    'activateParents'=>true,
    'items' => [
        [
            'label' => 'Backend routes',
            'items'=>UserManagementModule::menuItems()
        ],
        [
            'label' => 'Frontend routes',
            'items'=>[
                ['label'=>'Вход', 'url'=>['/user-management/auth/login']],
                ['label'=>'Выход', 'url'=>['/user-management/auth/logout']],
                ['label'=>'Регистрация', 'url'=>['/user-management/auth/registration']],
                ['label'=>'Смена пароля', 'url'=>['/user-management/auth/change-own-password']],
                ['label'=>'Восстановление пароля', 'url'=>['/user-management/auth/password-recovery']],
                ['label'=>'Подтверждение e-mail', 'url'=>['/user-management/auth/confirm-email']],
            ],
        ],
    ],
]);
?>

Начало работы

По началу, из этого меню вы сможете увидеть только два пункта — Вход и Выход. А все потому, что у вас недостаточно прав для остальных пунктов меню.

Подобным образом работают и GhostNav::widget() and GhostHtml:a().

  1. Войдите используя superadmin/superadmin;
  2. Перейдите в раздел Permissions;
  3. Перейдите в раздел Roles;
  4. Перейдите в раздел User:
  5. Осознайте, что все работает и расслабьтесь.

Использование

Контроллеры могут иметь два свойства, которые делают весь контроллер или выбранное действие доступными всем:

public $freeAccess = true;
// или
public $freeAccessActions = ['first-action', 'another-action'];

Полезные хэлперы

User::hasRole($roles, $superAdminAllowed = true)

User::hasPermission($permission, $superAdminAllowed = true)
User::canRoute($route, $superAdminAllowed = true)

User::assignRole($userId, $roleName)
User::revokeRole($userId, $roleName)

User::getCurrentUser($fromSingleton = true)

Для подробностей — смотрите код соответствующих функций.

Управление ролями и доступом

Role::create($name, $description = null, $groupCode = null, $ruleName = null, $data = null)
Role::addChildren($parentName, $childrenNames, $throwException = false)
Role::removeChildren($parentName, $childrenNames)

События

События могут быть получены следующим образом:

'modules'=>[
    'user-management' => [
        'class' => 'webvimark\modules\UserManagement\UserManagementModule',
        'on afterRegistration' => function(UserAuthEvent $event) {
            // Here you can do your own stuff like assign roles, send emails and so on
        },
    ],
],

Расширенный профиль пользователя

Для создания расширенного профиля пользователя с аватаром, днем рождения и прочими свойствами, нужно самостоятельно разработать профили, не затрагивая данное расширение:

  1. Создать таблицу и модель для профиля, включая связь по полю user_id с таблицей user;
  2. Проверить работу AuthController::actionRegistration();
  3. Объявить свой layout для регистрации (пример есть в AuthHelper::layoutHandler()). Использовать темизацию для изменения файла registration.php.
  4. Объявить свой класс UserManagementModule::$registrationFormClass. В этом классе реализовать валидацию и сохранение профиля;
  5. Создать свой контроллер для отображения информации профиля пользователя.

5 thoughts on “Yii2: Управление пользователями RBAC

  1. Виктория

    А для yii2 advanced в какой файл добавлять компонент и модуль ? в какую папку frontend или common?

    1. nix Автор записи

      Виктория, если компоненты используются только в frontend части приложения, значит в соответствующий конфигурационный файл и нужно добавлять его описание. Файлы в каталоге common включаются и backend и frontend. Подробнее описано в документации: http://www.yiiframework.com/doc-2.0/guide-tutorial-advanced-app.html#configuration-and-environments.

  2. Андрей

    Всё установил, всё работает, но.
    Со всем разобрался, но как быть с правами? В yii1 я пользовался кажется плагином rights и всё было ок. Там находились автоматом все экшены. А тут создал право и что дальше, по роутам видно что здесь только экшены самого плагина и всякий хлам (//crud, /asset/compress, /migrate/create и д.п.), а как быть с экшенами из других модулей и тем же siteController. Я что-то не так установил?

  3. Владимир

    Извините, но в чью больную голову пришла мысль, сделать для незарегистрированного пользователя доступным «Выход» и недоступной «Регистрацию»?

  4. Сергей

    не пойму куда капать, шаблон advanced открывается доступ в админку по не существующим адресам. куда копать.

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

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