Во многих приложениях проблема управления пользователями стоит чуть ли не на первом месте и поэтому в 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().
- Войдите используя superadmin/superadmin;
- Перейдите в раздел Permissions;
- Перейдите в раздел Roles;
- Перейдите в раздел User:
- Осознайте, что все работает и расслабьтесь.
Использование
Контроллеры могут иметь два свойства, которые делают весь контроллер или выбранное действие доступными всем:
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 }, ], ],
Расширенный профиль пользователя
Для создания расширенного профиля пользователя с аватаром, днем рождения и прочими свойствами, нужно самостоятельно разработать профили, не затрагивая данное расширение:
- Создать таблицу и модель для профиля, включая связь по полю user_id с таблицей user;
- Проверить работу AuthController::actionRegistration();
- Объявить свой layout для регистрации (пример есть в AuthHelper::layoutHandler()). Использовать темизацию для изменения файла registration.php.
- Объявить свой класс UserManagementModule::$registrationFormClass. В этом классе реализовать валидацию и сохранение профиля;
- Создать свой контроллер для отображения информации профиля пользователя.
А для yii2 advanced в какой файл добавлять компонент и модуль ? в какую папку frontend или common?
Виктория, если компоненты используются только в frontend части приложения, значит в соответствующий конфигурационный файл и нужно добавлять его описание. Файлы в каталоге common включаются и backend и frontend. Подробнее описано в документации: http://www.yiiframework.com/doc-2.0/guide-tutorial-advanced-app.html#configuration-and-environments.
Всё установил, всё работает, но.
Со всем разобрался, но как быть с правами? В yii1 я пользовался кажется плагином rights и всё было ок. Там находились автоматом все экшены. А тут создал право и что дальше, по роутам видно что здесь только экшены самого плагина и всякий хлам (//crud, /asset/compress, /migrate/create и д.п.), а как быть с экшенами из других модулей и тем же siteController. Я что-то не так установил?
Извините, но в чью больную голову пришла мысль, сделать для незарегистрированного пользователя доступным «Выход» и недоступной «Регистрацию»?
не пойму куда капать, шаблон advanced открывается доступ в админку по не существующим адресам. куда копать.