Задать вопрос
GONJY_MONJY
@GONJY_MONJY
В поисках новых горизонтов

Как отклонить вход пользователю с определённой ролью на Yii2?

Здравствуйте! Я сделал проверку роли пользователя, чтобы запретить вход пользователю, чья почта не подтверждена. Но код слегка не работает. выдаётся такая ошибка:
Object of class app\modules\userAuth\models\User could not be converted to string.

Вот этот код - это метод проверки роли:
public function checkUserRole(){

        $user = User::findOne(['username' => $this->username]);
        $role = Yii::$app->authManager->getRolesByUser($user);

        if($role === "user"){
            return false;
        }
        if($role === "active"){
            return true;
        }
    }


Вот этот код - это actionLogin в контроллере:
public function actionLogin(){

        $model = new LoginForm();
        
        if(!Yii::$app->user->isGuest){
            return $this->goHome();
        }

        if($model->load(Yii::$app->request->post()) && $model->login()){
            if($model->checkUserRole() === true){
                return $this->goHome();
            } else{
                Yii::$app->user->logout();
                Yii::$app->getSession()->setFlash('error','Please, confirm your E-mail!');  
                return $this->goHome();
            }
        }

        $model->password = '';
        
        return $this->render('login', compact('model'));

    }


Если кто-то сталкивался с этим, то прошу помочь мне с решением моего вопроса. Хотя и указать на мою ошибку, из-за которой не работает правильно код, было бы неплохо.
  • Вопрос задан
  • 427 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 1
myks92
@myks92 Куратор тега Yii
Нашёл решение — пометь вопрос ответом!
Не очень понятно почему в методе 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 делает следующее:
  • Если пользователь гость, вызывается yii\web\User::loginRequired(), который перенаправляет браузер на страницу входа.
  • Если пользователь авторизован, генерируется исключение yii\web\ForbiddenHttpException.

Более сложные правила можно выносить в свои фильтры AccessControl

Ссылки на документацию по теме:
  1. yii\web\User
  2. yii\rbac\ManagerInterface
  3. yii\rbac\CheckAccessInterface
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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