Как создать более гибкие права для каждого пользователя в yii2?

В Yii2 права доступа для каждого пользователя можно настроить с помощью концепции "ролей" и "правил доступа". Роли определяют набор разрешений, которые могут быть присвоены пользователям, а правила доступа определяют, какие действия пользователя могут выполнять в соответствии с его ролью.

Для создания более гибких прав доступа для каждого пользователя в Yii2, вам необходимо выполнить следующие шаги:

1. Создайте таблицу в базе данных для хранения ролей и разрешений. Пример таблицы может выглядеть следующим образом:

CREATE TABLE roles (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    description TEXT
);

CREATE TABLE permissions (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    description TEXT
);

CREATE TABLE role_permission (
    role_id INT,
    permission_id INT,
    FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE,
    FOREIGN KEY (permission_id) REFERENCES permissions(id) ON DELETE CASCADE,
    PRIMARY KEY (role_id, permission_id)
);

2. Создайте модели Role и Permission с соответствующими правилами валидации (например, проверка на уникальное имя роли или разрешения).

3. Создайте связь между моделями Role и Permission с помощью метода hasMany() и viaTable():

public function getPermissions()
{
    return $this->hasMany(Permission::class, ['id' => 'permission_id'])
        ->viaTable('role_permission', ['role_id' => 'id']);
}

4. Создайте модель User и добавьте методы, использующие роли и разрешения:

public function getRoles()
{
    return $this->hasMany(Role::class, ['id' => 'role_id'])
        ->viaTable('user_role', ['user_id' => 'id']);
}

public function hasPermission($permissionName)
{
    foreach ($this->roles as $role) {
        if ($role->getPermissions()->where(['name' => $permissionName])->exists()) {
            return true;
        }
    }
    return false;
}

5. Используйте метод hasPermission() в контроллерах или представлениях для проверки разрешений пользователя:

if (Yii::$app->user->identity->hasPermission('createPost')) {
    // выполнение действий доступных только пользователям с разрешением 'createPost'
}

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

Надеюсь, это руководство поможет вам создать более гибкие права доступа для каждого пользователя в Yii2.