наследование ролей в yii2 (rbac)

Всё про контроль доступа пользователей: фильтры, RBAC, проверки
Ответить
popoff17
Сообщения: 27
Зарегистрирован: 2015.05.08, 21:32

наследование ролей в yii2 (rbac)

Сообщение popoff17 »

Доброго вечера!
Господа,помогите пожалуйста разобраться с настройкой прав, а точнее - можно ли наследовать их?.

опишу сначала вкрадце:
есть контроллер common/controllers/BackendController.php который наследует Controller и содержит правила доступа
все контроллеры приложения наследуют не Controller, a BackendController, чтобы по сто раз правила не переписывать и не загромождать код.
и вот в одном кнтроллере нужно изменить одно лишь правило. как это сделать?

теперь подробно опишу ситуацию "на пальцах", чтобы понятнее было:
В моем приложении есть несколько контроллеров и две роли: админ и юзер. во всех контроллерах есть один и тот же набор методов: index, delete, view, update, и ко всем методам имеют доступ обе роли.
чтобы в каждом контроллере не прописывать один и тот же набор правил я вынес все в отдельный контроллер и наследую его. т.е.
создал "common/controllers/BackendController.php" в нем:

Код: Выделить всё


namespace common\controllers;
use Yii;
use yii\web\Controller;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
class BackendController extends Controller
{
    public function behaviors()
    ...
    ...
    ...
    ...
    
 
а уже в контроллерах приложения наследую не Controller а BackendController, соответственно. и метод behaviors() в нем не вызываю, по сто раз не дублирую одно и то же.
все бы хорошо, но понадобилось мне, чтобы в контроллере PostController к экшену delete был доступ только у админа.

если в PostController вызывать метод behaviors() и полностью дублировать права, за изменением одного лишь метода, то смысла в общем контроллере нет, т.к. таких контроллеров с измененным доступом к лишь одному методу может быть много...

Попробовал сделать так: в PostController вызывать метод behaviors(), переписать одно лишь правило и передать в родительский метод behaviors(), с параметром. а там смержить массивы. но не сработало:

Код: Выделить всё

    public function behaviors()
    {
        return parent::behaviors($rules);
    }
 

в итоге получается такой массив правил:

Код: Выделить всё

        $rules = [
        [
                        'actions' => ['delete'],
                        'allow' => true,
            'roles' => ['admin'],
                    ],
        [
                        'actions' => ['index', 'delete', 'view', 'update'],
                        'allow' => true,
            'roles' => ['user'],
                    ],
                    
                ];
 
и он не работает, т.к. метод delete для юзера разрешен и админ его не перекрывает. как можно реализовать мою задумку?
я вижу два выхода:
1 - полностью в контроллере переписывать все правила
2 - в BackendController в методе behaviors() прогонять массивы с ролями и из изначальных правил выкидывать те, что пришли из контроллера PostController.

подскажите, какие-то могут быть еще варианты?

Заранее благодарен!
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: наследование ролей в yii2 (rbac)

Сообщение Onotole »

Код: Выделить всё

public function behaviors()
{
    return [
            [
                    'actions' => ['delete'],
                    'allow' => true,
                    'roles' => ['admin'],
            ],
            [
                'actions' => ['index', 'delete', 'view', 'update'],
                    'allow' => true,
                'roles' => ['user'],
            ],
    ];
}
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: наследование ролей в yii2 (rbac)

Сообщение zelenin »

return [....];

return array_merge(parent::rules(), [...]);
popoff17
Сообщения: 27
Зарегистрирован: 2015.05.08, 21:32

Re: наследование ролей в yii2 (rbac)

Сообщение popoff17 »

Спасибо большое! Разобрался)
Ответить