Yii2 RBAC проверяет разрешения без каждого действия в контроллере


Как я могу проверить разрешения в одном месте?
Я не хочу проверять каждую функцию по отдельности.

Мой контроллер RBAC. Я хотел бы проверить разрешение для вошедшего пользователя для всех действий в контроллере. Теперь я должен использовать Yii::$app->user->can('...') индивидуально для каждого действия в контроллере

$admin = $auth->createRole('Admin');
$moderator = $auth->createRole('Moderator');

$createPost=$auth->createPermission('createPost');
$updatePost=$auth->createPermission('updatePost');
$deletePost=$auth->createPermission('deletePost');
$createCategory=$auth->createPermission('createCategory');
$updateCategory=$auth->createPermission('updateCategory');
$deleteCategory=$auth->createPermission('deleteCategory');


$auth->add($admin);
$auth->add($moderator);
$auth->add($createPost);
$auth->add($updatePost);
$auth->add($deletePost);
$auth->add($createCategory);
$auth->add($updateCategory);
$auth->add($deleteCategory);

Здесь я назначаю роль с разрешениями, но я никогда не использую эти разрешения, потому что пишу вручную в поведении - >(как ваш пример)

Что такое цель, создание разрешений в RBAC, если это не сработает? Если я хотел бы добавить премиум пользователя. Я мог только добавить действие в контроллер, например actionPremium, и установить в поведении действия для премиум-пользователя.

Например

Action=>['premium'] роли=>['premiumUser']

И еще один вопрос. Как в поведении настроить сообщение об ошибке?

$auth->addChild($admin,$moderator);
$auth->addChild($admin,$createCategory);
$auth->addChild($admin,$updateCategory);
$auth->addChild($admin,$deleteCategory);
$auth->addChild($moderator, $createPost);
$auth->addChild($moderator, $updatePost);
$auth->addChild($moderator, $deletePost);


$auth->assign($admin,1);
$auth->assign($moderator,2);
1 2

1 ответ:

Вы можете назначить разрешение, разрешенное в контроллере для всех действий в поведениях

public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                [
                    'actions' => ['index','view'], // these action are accessible 
                                                   //only the yourRole1 and yourRole2
                    'allow' => true,
                    'roles' => ['yourRole1', 'yourRole2'],
                ],
                [    // all the action are accessible to superadmin, admin and manager
                    'allow' => true,  
                    'roles' => ['superAdmin', 'admin', 'manager'],
                ],   
            ],
        ],        
        'verbs' => [
            'class' => VerbFilter::className(),
            'actions' => [
                'delete' => ['post'],
            ],
        ],
    ];
}

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

Вы также можете проверить роль в процедурном коде с помощью

if ( Yii::$app->User->can('admin') ){
    .....
    yourdCode
    ....
}