На 7-ом уроке мы разберем одну из тем в веб-разработке, это управление пользователями. В Yii 2 для этого есть мощные инструменты, такие как аутентификация (проверка, кто пользователь) и авторизация (определение, что он может делать). Мы научимся настраивать компонент user, создавать регистрацию и вход, а также работать с ролями и правами через RBAC. В конце я покажу, как ограничить доступ к админ-панели.
Настройка компонента user
Первым делом разберемся с компонентом userэто основа для работы с пользователями в Yii 2. Он хранит состояние аутентификации и управляет доступом.
Компонент настраивается в файле config/web.php. Найдите секцию components и добавьте (или измените) параметры для user:
'components' => [ 'user' => [ 'identityClass' => 'app\models\User', // Модель пользователя 'enableAutoLogin' => true, // Запомнить пользователя 'loginUrl' => ['site/login'], // Страница входа 'authTimeout' => 86400, // Время бездействия до выхода (секунды) ], ],
- identityClass это класс модели, которая реализует интерфейс
IdentityInterface. По умолчанию это модельUser, созданная при установке Yii 2. - enableAutoLogin это разрешает сохранение аутентификации через куки.
- loginUrl это куда перенаправлять неавторизованных пользователей.
Проверьте модель User:
Убедитесь, что ваша модель app\models\User реализует методы IdentityInterface, особенно findIdentity(), getId(), validateAuthKey(). Это нужно для работы механизма аутентификации.
Пример метода findIdentity():
public static function findIdentity($id) { return self::findOne($id); // Ищем пользователя по ID }
Совет: Если вы используете свою таблицу пользователей, не забудьте обновить поля в модели (например, username, password_hash, auth_key).
Реализация регистрации и входа
Теперь создадим формы регистрации и входа. Начнем с регистрации.
Регистрация
- Добавьте действие
actionSignupвSiteController:
public function actionSignup() { $model = new User(); if ($model->load(Yii::$app->request->post())) { // Хешируем пароль $model->password_hash = Yii::$app->security->generatePasswordHash($model->password); // Генерируем auth_key для кук $model->auth_key = Yii::$app->security->generateRandomString(); if ($model->save()) { Yii::$app->user->login($model); // Автоматический вход после регистрации return $this->goHome(); } } return $this->render('signup', ['model' => $model]); }
- Создайте представление
views/site/signup.php:
<?php $form = ActiveForm::begin(); ?> <?= $form->field($model, 'username')->textInput() ?> <?= $form->field($model, 'password')->passwordInput() ?> <?= Html::submitButton('Зарегистрироваться') ?> <?php ActiveForm::end(); ?>
Поле password в модели должно быть объявлено как safe в правилах валидации:
public function rules() { return [ [['password'], 'safe'], ]; }
Вход
Для входа используем встроенный actionLogin, который уже есть в SiteController. Проверьте, что представление views/site/login.php содержит форму с полями username и password.
Пример валидации в модели:
public function rules() { return [ [['username', 'password'], 'required'], ['password', 'validatePassword'], // Кастомный метод ]; } public function validatePassword($attribute) { if (!$this->hasErrors()) { $user = $this->getUser(); if (!$user || !$user->validatePassword($this->password)) { $this->addError($attribute, 'Неверный логин или пароль.'); } } }
Метод validatePassword в модели User:
public function validatePassword($password) { return Yii::$app->security->validatePassword($password, $this->password_hash); }
Роли и права: работа с RBAC
RBAC (Role-Based Access Control) это система управления доступом на основе ролей. В Yii 2 она реализована через компонент authManager.
Настройка RBAC
- Добавьте компонент в
config/web.php:
'components' => [ 'authManager' => [ 'class' => 'yii\rbac\DbManager', ], ],
- Примените миграции для создания таблиц RBAC:
yii migrate --migrationPath=@yii/rbac/migrations
Создание ролей и разрешений
Роли (например, admin, user) и разрешения (create_post, delete_user) можно создавать через консольный контроллер.
Пример кода для создания роли:
$auth = Yii::$app->authManager; // Создаем разрешение $createPost = $auth->createPermission('create_post'); $createPost->description = 'Создание поста'; $auth->add($createPost); // Создаем роль "author" и даем разрешение $author = $auth->createRole('author'); $auth->add($author); $auth->addChild($author, $createPost);
Как назначить роль пользователю:
$auth = Yii::$app->authManager; $adminRole = $auth->getRole('admin'); $auth->assign($adminRole, $user->getId()); // $user модель пользователя
Проверка прав в коде
Используйте Yii::$app->user->can():
if (Yii::$app->user->can('create_post')) { echo 'Вы можете создавать посты!'; }
Для управления ролями создайте админ-панель или используйте консольные команды.
Ограничение доступа к админ-панели
Допустим, у нас есть контроллер AdminController, который должен быть доступен только администраторам.
- Добавьте поведение
AccessControlв контроллер:
public function behaviors() { return [ 'access' => [ 'class' => AccessControl::class, 'rules' => [ [ 'allow' => true, 'roles' => ['admin'], // Только для роли "admin" ], ], ], ]; }
- Убедитесь, что у пользователя есть роль
admin. Если нет, то перенаправьте его на страницу входа.
Как проверить роль в представлении:
<?php if (Yii::$app->user->can('admin')): ?> <?= Html::a('Админка', ['admin/index']) ?> <?php endif; ?>
Практические задачи
- Реализуйте форму регистрации с полями: email, username, password.
- Добавьте капчу (Captcha) на страницу входа.
- Создайте роли
userиadminчерез консольный скрипт. - Ограничьте доступ к действию
actionCreateв контроллереPostControllerтолько для авторизованных пользователей. - Настройте автоматическое назначение роли
userпри регистрации.
Пример назначения роли после регистрации:
// В actionSignup после сохранения пользователя $auth = Yii::$app->authManager; $userRole = $auth->getRole('user'); $auth->assign($userRole, $model->id);
Сегодня мы разобрали, как работать с пользователями в Yii 2, настраивать компонент user, создавать формы входа и регистрации, управлять ролями через RBAC. Попробуйте выполнить практические задания это поможет закрепить материал.
Если что-то не получается, пишите в комментариях. Полный курс с уроками по Yii 2 для начинающих.
Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.


