[РЕШЕНО] Динамические БД и RBAC (DbManager) Yii2?

Yii2 предоставляет гибкий и мощный механизм для работы с динамическими базами данных и моделирования ролевой системы доступа (RBAC) с использованием компонента DbManager. Рассмотрим подробнее оба аспекта.

Для работы с динамическими базами данных Yii2 предоставляет набор классов и компонентов, которые позволяют создавать таблицы и выполнять запросы к ним в процессе исполнения приложения. Если вы храните информацию о различных моделях или данных в разных базах данных, вы можете динамически создавать таблицы и выполнять запросы с помощью класса yiidbConnection.

Допустим, у вас есть модель User и вам нужно создать таблицу для хранения данных о пользователях в момент выполнения приложения. Вы можете сделать это следующим образом:

<?php

use yiidbMigration;

class m210123_120000_create_user_table extends Migration
{
    public function up()
    {
        $this->createTable('user', [
            'id' => $this->primaryKey(),
            'username' => $this->string()->notNull(),
            'email' => $this->string()->notNull(),
        ]);
    }

    public function down()
    {
        $this->dropTable('user');
    }
}

После этого вы можете выполнить миграцию с помощью консольной команды yii migrate, и таблица пользователей будет создана в вашей базе данных.

Теперь рассмотрим ролевую систему доступа (RBAC) с использованием компонента DbManager. RBAC позволяет ограничить доступ пользователей к определенным действиям и ресурсам в вашем приложении. DbManager - это компонент Yii2, который предоставляет возможность хранить данные RBAC в базе данных.

Для начала нужно настроить компонент DbManager в конфигурационном файле приложения. Например, в файле config/web.php вы можете добавить следующую конфигурацию:

<?php

return [
    'components' => [
        'authManager' => [
            'class' => 'yiirbacDbManager',
        ],
    ],
];

Затем вы можете использовать DbManager для создания ролей и разрешений. Например, можно создать роль "admin" и разрешение "manageUsers" следующим образом:

<?php

use yiibaseNotSupportedException;
use yiirbacDbManager;
use yiiconsoleController;

class RbacController extends Controller
{
    public function actionInit()
    {
        /** @var DbManager $authManager */
        $authManager = Yii::$app->authManager;

        // Create roles
        $adminRole = $authManager->createRole('admin');
        $authManager->add($adminRole);

        // Create permissions
        $manageUsersPermission = $authManager->createPermission('manageUsers');
        $authManager->add($manageUsersPermission);

        // Assign permissions to roles
        $authManager->addChild($adminRole, $manageUsersPermission);

        echo 'RBAC initialized.' . PHP_EOL;
    }
}

После этого вы можете использовать RBAC для ограничения доступа в вашем приложении. Например, в контроллере UserController вы можете добавить фильтр на уровне действия для проверки разрешения:

<?php

use yiiwebController;

class UserController extends Controller
{
    public function behaviors()
    {
        return [
            'access' => [
                'class' => yiifiltersAccessControl::class,
                'only' => ['index', 'view'],
                'rules' => [
                    [
                        'allow' => true,
                        'actions' => ['index'],
                        'roles' => ['admin'],
                    ],
                    [
                        'allow' => true,
                        'actions' => ['view'],
                        'roles' => ['manageUsers'],
                    ],
                ],
            ],
        ];
    }

    public function actionIndex()
    {
        // Some logic for admin users only
    }

    public function actionView($id)
    {
        // Some logic for users with manageUsers permission
    }
}

Таким образом, вы можете использовать Yii2 для работы с динамическими базами данных и создания ролей и разрешений для ограничения доступа в вашем приложении.