Проблема заключается в том, что 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. Но эта функция будет вызываться всегда, при любой ошибке. Например, я не понял как через неё вывести текст ошибки, и её содержание, нужное для дальнейших действий.