Урок 7: Аутентификация и авторизация в Yii 2

На 7-ом уроке мы разберем одну из тем в веб-разработке, это управление пользователями. В Yii 2 для этого есть мощные инструменты, такие как аутентификация (проверка, кто пользователь) и авторизация (определение, что он может делать). Мы научимся настраивать компонент user, создавать регистрацию и вход, а также работать с ролями и правами через RBAC. В конце я покажу, как ограничить доступ к админ-панели.

Настройка компонента user

Первым делом разберемся с компонентом userэто основа для работы с пользователями в Yii 2. Он хранит состояние аутентификации и управляет доступом.

Компонент настраивается в файле config/web.php. Найдите секцию components и добавьте (или измените) параметры для user:

php
'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():

php
public static function findIdentity($id) {
    return self::findOne($id); // Ищем пользователя по ID
}

Совет: Если вы используете свою таблицу пользователей, не забудьте обновить поля в модели (например, usernamepassword_hashauth_key).

Реализация регистрации и входа

Теперь создадим формы регистрации и входа. Начнем с регистрации.

Регистрация

  1. Добавьте действие actionSignup в SiteController:
php
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]);
}
  1. Создайте представление views/site/signup.php:
php
<?php $form = ActiveForm::begin(); ?>
    <?= $form->field($model, 'username')->textInput() ?>
    <?= $form->field($model, 'password')->passwordInput() ?>
    <?= Html::submitButton('Зарегистрироваться') ?>
<?php ActiveForm::end(); ?>

Поле password в модели должно быть объявлено как safe в правилах валидации:

php
public function rules() {
    return [
        [['password'], 'safe'],
    ];
}

Вход

Для входа используем встроенный actionLogin, который уже есть в SiteController. Проверьте, что представление views/site/login.php содержит форму с полями username и password.

Пример валидации в модели:

php
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:

php
public function validatePassword($password) {
    return Yii::$app->security->validatePassword($password, $this->password_hash);
}

Роли и права: работа с RBAC

RBAC (Role-Based Access Control) это система управления доступом на основе ролей. В Yii 2 она реализована через компонент authManager.

Настройка RBAC

  1. Добавьте компонент в config/web.php:
php
'components' => [
    'authManager' => [
        'class' => 'yii\rbac\DbManager',
    ],
],
  1. Примените миграции для создания таблиц RBAC:
bash
yii migrate --migrationPath=@yii/rbac/migrations

Создание ролей и разрешений

Роли (например, adminuser) и разрешения (create_postdelete_user) можно создавать через консольный контроллер.

Пример кода для создания роли:

php
$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);

Как назначить роль пользователю:

php
$auth = Yii::$app->authManager;
$adminRole = $auth->getRole('admin');
$auth->assign($adminRole, $user->getId()); // $user модель пользователя

Проверка прав в коде

Используйте Yii::$app->user->can():

php
if (Yii::$app->user->can('create_post')) {
    echo 'Вы можете создавать посты!';
}

Для управления ролями создайте админ-панель или используйте консольные команды.

Ограничение доступа к админ-панели

Допустим, у нас есть контроллер AdminController, который должен быть доступен только администраторам.

  1. Добавьте поведение AccessControl в контроллер:
php
public function behaviors() {
    return [
        'access' => [
            'class' => AccessControl::class,
            'rules' => [
                [
                    'allow' => true,
                    'roles' => ['admin'], // Только для роли "admin"
                ],
            ],
        ],
    ];
}
  1. Убедитесь, что у пользователя есть роль admin. Если нет, то перенаправьте его на страницу входа.

Как проверить роль в представлении:

php
<?php if (Yii::$app->user->can('admin')): ?>
    <?= Html::a('Админка', ['admin/index']) ?>
<?php endif; ?>

Практические задачи

  1. Реализуйте форму регистрации с полями: email, username, password.
  2. Добавьте капчу (Captcha) на страницу входа.
  3. Создайте роли user и admin через консольный скрипт.
  4. Ограничьте доступ к действию actionCreate в контроллере PostController только для авторизованных пользователей.
  5. Настройте автоматическое назначение роли user при регистрации.

Пример назначения роли после регистрации:

php
// В actionSignup после сохранения пользователя
$auth = Yii::$app->authManager;
$userRole = $auth->getRole('user');
$auth->assign($userRole, $model->id);

Сегодня мы разобрали, как работать с пользователями в Yii 2, настраивать компонент user, создавать формы входа и регистрации, управлять ролями через RBAC. Попробуйте выполнить практические задания это поможет закрепить материал.

Если что-то не получается, пишите в комментариях. Полный курс с уроками по Yii 2 для начинающих.

Поделиться статьей:
Поддержать автора блога

Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.

Персональные рекомендации
Оставить комментарий