Как настроить управление пользователями и правами доступа в Yii2 с нуля.
Будем использовать приложение Yii2 Advanced, подключим модули "yii2-user" и "yii2-admin".
Если у вас уже есть готовое приложение, шаги с 1 по 5 можно пропустить.
1. Создаём проект по шаблону Advanced.
Здесь предполагается, что вы уже настроили Composer. Если нет, см. документацию к шаблону.
composer create-project --prefer-dist yiisoft/yii2-app-advanced yii2-user-combo.local
cd yii2-user-combo.local
init
0
yes
2. Удаляем миграцию стандартных юзеров, она нам не нужна: "console/migrations/m130524_201442_init.php".
3. Добавляем файлы ".htaccess" в папки "/frontend/web", "/backend/web", а также в корень проекта.
В моём примере, фронтенд будет доступен по адресу "http://yii2-user-combo.local".
Бэкенд по адресу "http://yii2-user-combo.local/admin".
/.htaccess
Options -Indexes
Options FollowSymlinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^(.*)$ http://%1/$1 [L,R=301]
RewriteCond %{REQUEST_URI} ^/admin/$
RewriteRule ^(admin)/$ /$1 [R=301,L]
RewriteCond %{REQUEST_URI} ^/admin
RewriteRule ^admin(/.+)?$ /backend/web/$1 [L,PT]
RewriteCond %{REQUEST_URI} ^.*$
RewriteRule ^(.*)$ /frontend/web/$1
/backend/web/.htaccess
# use mode rewrite for pretty URL support
RewriteEngine on
# if a directory or a file exists, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# otherwise forward the request to index.php
RewriteRule . index.php
/frontend/web/.htaccess
<IfModule mod_rewrite.c>
Options +FollowSymlinks
# Включаем mod_rewrite и перенаправляем со слэша
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} (.*)
RewriteCond %{REQUEST_URI} /$ [NC]
RewriteRule ^(.*)(/)$ $1 [L,R=301]
# Если это папка или файл, открываем ее/его
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# В противном случае перенаправляем на index.php
RewriteRule . index.php
</IfModule>
4. Создаём БД, указываем её в конфиге "common/config/main-local.php".
5. Настраиваем конфиги.
backend/config/main.php
'components' => [
'request' => [
...
'baseUrl'=>'/admin',
],
common/config/main.php
'language' => 'ru-RU',
...
'components' => [
...
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
],
frontend/config/main.php
'components' => [
'request' => [
// Избавляемся от /frontend/web
'baseUrl' => '',
...
],
6. Ставим "yii2-user".
composer require dektrium/yii2-user
7. Убираем из конфига компонент "user", вместо него подключаем дектриумовский модуль.
Настройку модуля пользователей сделаем только для бэкенда. Для фронтенда настройки будут аналогичные.
backend/config/main.php
'modules' => [
// ID модуля должен обязательно быть "user", иначе модуль не загрузится.
'user' => [
'class' => 'dektrium\user\Module',
'admins' => ['MegaAdmin'], // Хардкод для админского пользователя. После настройки прав доступа, нужно удалить эту строку.
],
],
8. Подключаем консольные команды.
console/config/main.php
'modules' => [
'user' => [
'class' => 'dektrium\user\Module',
],
],
9. Создаём таблицы для пользователей.
yii migrate --migrationPath=@vendor/dektrium/yii2-user/migrations
10. Убираем неиспользуемые действия из контроллеров.
backend/controllers/SiteController.php
Приводим "behaviors" к такому виду.
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => ['error'],
'allow' => true,
],
[
'actions' => ['index'],
'allow' => true,
'roles' => ['@'],
],
],
],
];
}
Убираем лишние действия.
public function actionLogin()
public function actionLogout()
11. Удаляем файл представления
/backend/views/site/login.php
12. Меняем в файле
/backend/views/layouts/main.php
/site/login на /user/security/login
/site/logout на /user/security/logout
13. Ставим расширение "yii2-admin".
composer require mdmsoft/yii2-admin
14. Настраиваем конфиги.
backend/config/main.php
'bootstrap' => [
...
'users-admin',
],
...
'modules' => [
...
// ID модуля может быть любой.
'users-admin' => [
'class' => 'mdm\admin\Module',
// Отключаем шаблон модуля,
// используем шаблон нашей админки.
'layout' => null,
]
],
...
'as access' => [
'class' => 'mdm\admin\classes\AccessControl',
// Маршруты, открытые по умолчанию всегда.
// Открываем только для начальной разработки.
// Как только основные данные о ролях заполнены,
// убираем отсюда всё лишнее.
'allowActions' => [
// Маршруты модуля пользователей.
// Логин и так разрешён, но разлогиниться
// без этой настройки и без настроенных ролей не получится.
'user/*',
'site/*',
'users-admin/*',
'debug/*',
]
],
common/config/main.php
'components' => [
'authManager' => [
'class' => 'yii\rbac\DbManager',
],
15. Добавляем ассет для корректного отображения админки в нашем шаблоне.
backend\assets\AppAsset.php
public $depends = [
...
'dee\adminlte\AdminlteAsset',
];
16. Применяем миграции для использования RBAC.
yii migrate --migrationPath=@yii/rbac/migrations
17. Применяем миграции для редактирования меню.
yii migrate --migrationPath=@mdm/admin/migrations
18. Всё готово.
Управление правами доступа:
http://yii2-user-combo.local/admin/users-admin/
Управление пользователями:
http://yii2-user-combo.local/admin/user/admin
Настройки профиля:
http://yii2-user-combo.local/admin/user/settings/profile
Полный список маршрутов модуля пользователей: https://github.com/dektrium/yii2-user/blob/master/docs/available-actions.md
P.S. Можно подключать расширение "dektrium/yii2-rbac" для управления правами доступа.
Но расширение "mdmsoft/yii2-admin" удобнее.
Оба расширения позволяют полноценно настраивать права доступа.
Преимущества "yii2-admin":
1. Более удобное редактирование прав доступа.
2. Помощник для вывода меню с учётом прав доступа.
3. Редактор меню.
Преимущества "yii2-rbac":
1. Удобно создавать консольные миграции прав доступа.
2. Есть интеграция с yii2-user в виде общей админки.
Будем использовать приложение Yii2 Advanced, подключим модули "yii2-user" и "yii2-admin".
Если у вас уже есть готовое приложение, шаги с 1 по 5 можно пропустить.
1. Создаём проект по шаблону Advanced.
Здесь предполагается, что вы уже настроили Composer. Если нет, см. документацию к шаблону.
composer create-project --prefer-dist yiisoft/yii2-app-advanced yii2-user-combo.local
cd yii2-user-combo.local
init
0
yes
2. Удаляем миграцию стандартных юзеров, она нам не нужна: "console/migrations/m130524_201442_init.php".
3. Добавляем файлы ".htaccess" в папки "/frontend/web", "/backend/web", а также в корень проекта.
В моём примере, фронтенд будет доступен по адресу "http://yii2-user-combo.local".
Бэкенд по адресу "http://yii2-user-combo.local/admin".
/.htaccess
Options -Indexes
Options FollowSymlinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^(.*)$ http://%1/$1 [L,R=301]
RewriteCond %{REQUEST_URI} ^/admin/$
RewriteRule ^(admin)/$ /$1 [R=301,L]
RewriteCond %{REQUEST_URI} ^/admin
RewriteRule ^admin(/.+)?$ /backend/web/$1 [L,PT]
RewriteCond %{REQUEST_URI} ^.*$
RewriteRule ^(.*)$ /frontend/web/$1
/backend/web/.htaccess
# use mode rewrite for pretty URL support
RewriteEngine on
# if a directory or a file exists, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# otherwise forward the request to index.php
RewriteRule . index.php
/frontend/web/.htaccess
<IfModule mod_rewrite.c>
Options +FollowSymlinks
# Включаем mod_rewrite и перенаправляем со слэша
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} (.*)
RewriteCond %{REQUEST_URI} /$ [NC]
RewriteRule ^(.*)(/)$ $1 [L,R=301]
# Если это папка или файл, открываем ее/его
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# В противном случае перенаправляем на index.php
RewriteRule . index.php
</IfModule>
4. Создаём БД, указываем её в конфиге "common/config/main-local.php".
5. Настраиваем конфиги.
backend/config/main.php
'components' => [
'request' => [
...
'baseUrl'=>'/admin',
],
common/config/main.php
'language' => 'ru-RU',
...
'components' => [
...
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
],
frontend/config/main.php
'components' => [
'request' => [
// Избавляемся от /frontend/web
'baseUrl' => '',
...
],
6. Ставим "yii2-user".
composer require dektrium/yii2-user
7. Убираем из конфига компонент "user", вместо него подключаем дектриумовский модуль.
Настройку модуля пользователей сделаем только для бэкенда. Для фронтенда настройки будут аналогичные.
backend/config/main.php
'modules' => [
// ID модуля должен обязательно быть "user", иначе модуль не загрузится.
'user' => [
'class' => 'dektrium\user\Module',
'admins' => ['MegaAdmin'], // Хардкод для админского пользователя. После настройки прав доступа, нужно удалить эту строку.
],
],
8. Подключаем консольные команды.
console/config/main.php
'modules' => [
'user' => [
'class' => 'dektrium\user\Module',
],
],
9. Создаём таблицы для пользователей.
yii migrate --migrationPath=@vendor/dektrium/yii2-user/migrations
10. Убираем неиспользуемые действия из контроллеров.
backend/controllers/SiteController.php
Приводим "behaviors" к такому виду.
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => ['error'],
'allow' => true,
],
[
'actions' => ['index'],
'allow' => true,
'roles' => ['@'],
],
],
],
];
}
Убираем лишние действия.
public function actionLogin()
public function actionLogout()
11. Удаляем файл представления
/backend/views/site/login.php
12. Меняем в файле
/backend/views/layouts/main.php
/site/login на /user/security/login
/site/logout на /user/security/logout
13. Ставим расширение "yii2-admin".
composer require mdmsoft/yii2-admin
14. Настраиваем конфиги.
backend/config/main.php
'bootstrap' => [
...
'users-admin',
],
...
'modules' => [
...
// ID модуля может быть любой.
'users-admin' => [
'class' => 'mdm\admin\Module',
// Отключаем шаблон модуля,
// используем шаблон нашей админки.
'layout' => null,
]
],
...
'as access' => [
'class' => 'mdm\admin\classes\AccessControl',
// Маршруты, открытые по умолчанию всегда.
// Открываем только для начальной разработки.
// Как только основные данные о ролях заполнены,
// убираем отсюда всё лишнее.
'allowActions' => [
// Маршруты модуля пользователей.
// Логин и так разрешён, но разлогиниться
// без этой настройки и без настроенных ролей не получится.
'user/*',
'site/*',
'users-admin/*',
'debug/*',
]
],
common/config/main.php
'components' => [
'authManager' => [
'class' => 'yii\rbac\DbManager',
],
15. Добавляем ассет для корректного отображения админки в нашем шаблоне.
backend\assets\AppAsset.php
public $depends = [
...
'dee\adminlte\AdminlteAsset',
];
16. Применяем миграции для использования RBAC.
yii migrate --migrationPath=@yii/rbac/migrations
17. Применяем миграции для редактирования меню.
yii migrate --migrationPath=@mdm/admin/migrations
18. Всё готово.
Управление правами доступа:
http://yii2-user-combo.local/admin/users-admin/
Управление пользователями:
http://yii2-user-combo.local/admin/user/admin
Настройки профиля:
http://yii2-user-combo.local/admin/user/settings/profile
Полный список маршрутов модуля пользователей: https://github.com/dektrium/yii2-user/blob/master/docs/available-actions.md
P.S. Можно подключать расширение "dektrium/yii2-rbac" для управления правами доступа.
Но расширение "mdmsoft/yii2-admin" удобнее.
Оба расширения позволяют полноценно настраивать права доступа.
Преимущества "yii2-admin":
1. Более удобное редактирование прав доступа.
2. Помощник для вывода меню с учётом прав доступа.
3. Редактор меню.
Преимущества "yii2-rbac":
1. Удобно создавать консольные миграции прав доступа.
2. Есть интеграция с yii2-user в виде общей админки.