Yii2 — RBAC. Default Roles и Контроль доступа. Работает не так как надо?

Проблема заключается в том, что AccessControl не работает одинаково для стандартных групп пользователей ('?' и '@') и описанных через PhpManager
Вот описанные ролей в файле rbac.php ($authFile)
3 => [
    'type' => Item::TYPE_ROLE,
    'description' => 'Гость',
     ],
2 => [
    'type' => Item::TYPE_ROLE,
    'description' => 'Пользователь',
    'ruleName' => 'UserRule',
    'children' => [
        3,
    ],
],
1 => [
    'type' => Item::TYPE_ROLE,
    'description' => 'Админ',
    'ruleName' => 'AdminRule',
    'children' => [
        2,
    ],
],


Настройки менеджера авторизации: по умолчанию всем пользователям присваиваться роль 3 (Гость). Роли 1 и 2 присваиваются исходя из правил.

'authManager' => [
            'class' => 'common\components\rbac\PhpManager',
            'defaultRoles' => [1,2,3], 
        ],


и, собственно, настройки контроллера в behaviors
'access' => [
                'class' => AccessControl::className(),
                'only' => ['logout', 'signup','test'],
                'rules' => [
                    [
                        'actions' => ['test'],
                        'allow' => true,
                        'roles' => [2], // Разрешить только для пользователей с ролью "2".
                    ],
                ],
            ],


И теперь самое интересное и непонятное. Если я обращаюсь к экшну Test как админ (роль 3), то меня перекидывает на страницу Forbidden (#403), как и должно быть, т.к. доступ разрешен только группе 2.
Но если обратится к этому же экшну как неавторизированный пользователь, т.е пользователь с ролью 3, которая присвоена автоматически, то Yii выдает пустую белую страницу, хотя по идее должен вызываться метод yii\web\User::loginRequired(). Но, если поменять ограничение к экшну с двойки на '@', то всё снова работает как надо.

P.S. Можно, конечно, изощрятся путем добавления
'denyCallback' => function (){throw new ForbiddenHttpException(Yii::t('yii', 'Login Required'));}

в behaviors. Но эта функция будет вызываться всегда, при любой ошибке. Например, я не понял как через неё вывести текст ошибки, и её содержание, нужное для дальнейших действий.
  • Вопрос задан
  • 9884 просмотра
Пригласить эксперта
Ответы на вопрос 1
для решения проблемы кода недостаточно, да и судя по всему вы компонент модифицировали.

Советую вам воспользоваться вот этим https://github.com/zelenin/yii2-rbac-module
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы