Yii2 RBAC доступ по ролям

Настройка RBAC для шаблона Yii2 advanced

Для настройки RBAC я буду использовать класс DbManager. Для начала нам необходимо подключить базу данных к своему приложению. В шаблоне advanced для настройки БД используется файл common/config/main-local.php.

<?php
return [
    'components' => [
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=Название вашей базы',
            'username' => 'Пользователь базы',
            'password' => 'Пароль',
            'charset' => 'utf8',
        ],
       ...
    ],
];

Добавляем в файл common/config/main.php подключение через authManager

return [
    // ...
    'components' => [
        'authManager' => [
            'class' => 'yii\rbac\DbManager',
        ],
        // ...
    ],
];

1. Запускаем командную строку
2. Переходим в корневой каталог
3. Выполняем команду

yii migrate --migrationPath=@yii/rbac/migrations

После выполнения команды в нашей базе будут созданы 4 таблицы для работы с RBAC

- auth_assignment
- auth_item
- auth_item_child
- auth_rule

Добавляем роли и уровни доступа. Я буду использовать миграцию (миграция будет использоваться для добавления необходимых данных в БД). Для создании миграции в командной строке прописываем

yii migrate/create init_rbac

Эта команда создаст файл по адресу console/migrations. Вам необходимо найти файл с окончанием <какие-то цифры>init_rbac.php

Прописываем следующий код в этот файл

<?php

use yii\db\Migration;

/**
 * Class m191020_124803_init_rbac
 */
// У вас будет другое название класса, то которое сгенерировало Yii
class m191020_124803_init_rbac extends Migration
{
    /**
     * {@inheritdoc}
     */
    public function safeUp()
    {

    }

    public function up()
    {
        $auth = Yii::$app->authManager;

        // Добавляем доступ на создание постов
        $createPost = $auth->createPermission('createPost');
        $createPost->description = 'Create a post';
        $auth->add($createPost);

        // Добавляем доступ на обновление постов
        $updatePost = $auth->createPermission('updatePost');
        $updatePost->description = 'Update post';
        $auth->add($updatePost);

        // добавьте роль author и предоставьте этой роли разрешение createPost
        $author = $auth->createRole('author');
        $auth->add($author);
        $auth->addChild($author, $createPost);

        // добавить роль «admin» и даем этой роли разрешение «updatePost»
        // а также все права роли «author»
        $admin = $auth->createRole('admin');
        $auth->add($admin);
        $auth->addChild($admin, $updatePost);
        $auth->addChild($admin, $author);

        // Задаем пользователю с id=1 роль администратора 
        $auth->assign($admin, 1);
    }
    
    public function down()
    {
        $auth = Yii::$app->authManager;

        $auth->removeAll();
    }
}

Запускаем миграцию в командной строке

yii migrate

После выполнения команды в БД в таблицах создадутся поля.

Применяем уровни доступа к контролеру

Допустим у нас есть контроллер для работы с постами



namespace frontend\controllers;

use Yii;
use app\models\Post;
use app\models\PostSearch;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;

//Подключаем для работы с ролями AccessControl
use yii\filters\AccessControl;

/**
 * PostController implements the CRUD actions for Post model.
 */
class PostController extends Controller
{
    /**
     * {@inheritdoc}
     */
    public function behaviors()
    {
        return [
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'delete' => ['POST'],
                ],
            ],
			//Подключаем AccessControl
			'access' => [
				'class' => AccessControl::className(),	
				// Указываем методы к которым применяются правила			
				'only' =>  ['_form','_search','create', 'index','update', 'view'],
				'rules' => [									                    
                    // Index Доступен для роли author и admin
                    [                      
                        'allow' => true,
                        'actions' =>  ['index'],
                        'roles' => ['author', 'admin'],
                    ],
					// 'view','_form','_search', 'update','create' доступны только администратору. Если пользователь с ролью author попытается зайти, то он получит сообщение с ошибкой 403
					[                      
                        'allow' => true,
                        'actions' =>  ['view','_form','_search', 'update','create'],
                        'roles' => ['admin'],
                    ],
					
				],				
			],
        ];
    }
....

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *