Админ не может просматривать профили других пользователей (помогите разобраться с RBAC)

Всё про контроль доступа пользователей: фильтры, RBAC, проверки
Ответить
vo_wonder
Сообщения: 19
Зарегистрирован: 2017.05.17, 20:57

Админ не может просматривать профили других пользователей (помогите разобраться с RBAC)

Сообщение vo_wonder » 2017.07.06, 16:37

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

Использую шаблон advanced и пользуюсь его моделью User. Для authManager`а использую класс DbManager.

Для начала описываю общую идею. В системе возможны 3 роли пользователей: admin, arbitrator и editor. В админке:
  • пользователи с ролью admin могут создавать, просматривать профили и редактировать профили любых пользователей
  • пользователи, которые регистрируются через форму на сайте, автоматически получают роль arbitrator и в админке могут создавать пользователей с ролью editor, могут просматривать и редактировать профили только тех пользователей, которых они создали (для этого в модели User есть свойство parent_id: для admin и arbitrator - 0, а для editor - id пользователя, который его создал)
Вдоволь начитавшись и насмотревшись материалов по теме (в том числе и материалы от Дмитрия), соорудил консольный контроллер, создал там роли, вручную добавил пользователю с именем admin роль admin, создал парочку пользователей с ролью arbitrator, от их имени - по несколько пользователей с ролью editor и приступил к созданию разрешений. Вот пример моего творчества:

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

        $auth = Yii::$app->authManager;

        $rule = new AccessRule;
        $auth->add($rule);

        $adminRole = $auth->getRole('admin');
        $arbitratorRole = $auth->getRole('arbitrator');

        $canManagePermit = $auth->createPermission('canManage');
        $canManagePermit->description = 'Can manage';
        $auth->add($canManagePermit);

        $canManageOwnPermit = $auth->createPermission('canManageOwn');
        $canManageOwnPermit->description = 'Can manage own users';
        $canManageOwnPermit->ruleName = $rule->name;
        $auth->add($canManageOwnPermit);

        $auth->addChild($canManageOwnPermit, $canManagePermit);
        $auth->addChild($arbitratorRole, $canManageOwnPermit);

        $auth->addChild($adminRole, $canManagePermit);
        $auth->addChild($adminRole, $arbitratorRole);
Затем создал правило:

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

class AccessRule extends Rule
{
    public $name = 'canManageOwn';

    public function execute($userId, $item, $params)
    {
        if (isset($params['parent_id']) && ($params['parent_id'] == $userId)) {
            return true;
        } else {
            return false;
        }
    }
}
Запустил в консоли действие контроллера, в котором описывал разрешения, в БД соответствующие таблицы заполнились, правило создалось.

Решил проверить результаты на actionView в backend\controllers\UserController. Вот что там написано:

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

    public function actionView($id)
    {
        $model = $this->findModel($id);

        if (!Yii::$app->user->can('canManageOwn', ['parent_id' => $model->parent_id])) {
            throw new ForbiddenHttpException('Ouuups!');
        }

        return $this->render('view', [
            'model' => $model,
        ]);
    }
Залогинился под пользователем с ролью arbitrator и с радостью обнаружил, что не могу просмотреть профили пользователей, которые были созданы другими arbitrator`ами. Потом залогинился под admin и оказалось, что я не могу просмотреть профили ни одного из пользователей. Стоит ли говорить, что я очень огорчился?

Поэтому прошу ткнуть носом в место, где я допустил ошибку.

Ну, и чтобы 2 раза не вставать: так и не смог добиться хотя бы такого же результата, когда описывал доступ к действию в behavior в настройках AccessControl. Писал туда вот что:

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

[
    'actions' => ['view'],
    'allow' => true,
    'matchCallback' => function ($rule, $action) {
        $id = Yii::$app->request->get('id');
        return Yii::$app->user->can('canManageOwnUsers', ['parent_id' => User::getParentIdByUserId($id)]);
    }
],
но в итоге могу просматривать профиль любого пользователя вообще.

Надеюсь на помощь, заранее благодарю.

Аватара пользователя
yiijeka
Сообщения: 3070
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Админ не может просматривать профили других пользователей (помогите разобраться с RBAC)

Сообщение yiijeka » 2017.07.07, 10:28

Замечания:
- Наименование правила AccessRule:name такое же как и наименование разрешения canManageOwn
- Проверять надо не разрешение 'canManageOwn', а canManage

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

Yii::$app->user->can('canManage ', ['parent_id' => $model->parent_id])
- код AccessRule:execute() может быть приведён к виду:

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

public function execute($userId, $item, $params)
{
    return isset($params['parent_id']) && $params['parent_id'] == $userId;
}


Ответить