Не очень понятно почему в методе
actionLogin()
Вы используете такую сложную конструкцию, которая, в данном случае, не имеет особого смысла. На вашем примере можно попользоваться функцией:
Yii::$app->getAuthManager()->checkAccess(32, 'admin')
Данная функция позволит проверять доступ для остальных пользователей. Хорошая практика — использоовать ошибки в виде исключений с ошибкой
403 и сообщением:
public function actionLogin()
{
$model = new LoginForm();
$model->password = ''; // перенести в метод rules формы, как default
if($model->load(Yii::$app->request->post()) && $model->login()){
$user = User::findOne(['username' => $this->username]);
if(Yii::$app->getAuthManager()->checkAccess($user->getId(), 'admin')){
throw new ForbiddenHttpException('Ошибка доступа');
}
return $this->goHome();
}
return $this->render('login', [
'model' => $model
]);
}
Если же вам нужно использовать проверку для текущего пользователя - это вполне можно вынести в поведения:
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'actions' => ['create', 'update'],
'allow' => true,
'matchCallback' => function ($rule, $action) {
/** @var User $identity */
$identity = Yii::$app->user->getIdentity();
return $identity->isAdmin(); // или другая проверка
}
],
],
],
];
}
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::class,
'rules' => [
[
'actions' => ['create', 'update'],
'allow' => true,
'roles' => ['admin']
],
],
],
];
}
Значение опции
allow
выбранного правила указывает, авторизовывать пользователя или нет. Если ни одно из правил не совпало, то пользователь считается НЕавторизованным, и фильтр ACF останавливает дальнейшее выполнение действия. По умолчанию, когда у пользователя отсутствует доступ к текущему действию, ACF делает следующее:
Более сложные правила можно выносить в свои фильтры
AccessControl
Ссылки на документацию по теме:
- yii\web\User
- yii\rbac\ManagerInterface
- yii\rbac\CheckAccessInterface