Yii2 - Ограничить доступ для неподтвержденных счетов

Я пытаюсь выполнить проверку учетной записи электронной почты.

Если пользователь не подтвердил свое электронное письмо, они все равно могут войти в систему, но не могут получить доступ к каким-либо действиям в модуле account , Например, если они пытаются получить доступ:

/account/profile/edit /account/listing/add

, он должен перенаправить пользователя на /account/default/confirm, в котором отображается сообщение:

«Вы еще не подтвердили свою учетную запись, нажмите ссылку в подтверждающем письме или нажмите здесь, чтобы отправить письмо с подтверждением».

Я пробовал следующее:

BaseController:

class BaseController extends Controller
{
    protected function findUser($id)
    {
        if (($model = User::findOne(['id' => $id, 'deleted_at' => null])) !== null) {
            if ($model->confirmed_at == null) {
                return $this->redirect(['/account/default/confirm']);
            }

            return $model;
        } else {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
    }
}

ProfileController:

class ProfileController extends BaseController
{
    public function actionEdit()
    {
        $user = $this->findUser(Yii::$app->user->id);
        $profile = $user->profile; // getProfile() relation in User model

        return $this->render('index', [
            'profile' => $profile,
        ]);
    }
}

Проблема я что это дает мне ошибку:

«Вы еще не подтвердили свою учетную запись, нажмите ссылку в электронном подтверждении или нажмите здесь, чтобы отправить письмо с подтверждением».

«Попытка получить профиль свойства« не-объекта ».

Я думаю, что причина ошибки заключается в том, что она, похоже, назначает перенаправление на $user, вместо фактического завершения запроса при перенаправлении.

0
задан 13 August 2018 в 16:01

2 ответа

$this->redirect() вернет объект ответа - он выглядит очень плохой дизайн, если такой метод может вернуть полностью несвязанный объект (Response или User). Вероятно, вы должны вызвать Application::end(), чтобы завершить приложение, поэтому перенаправление вступит в силу без продолжения выполнения действия контроллера.

protected function findUser($id) {
    if (($model = User::findOne(['id' => $id, 'deleted_at' => null])) !== null) {
        if ($model->confirmed_at == null) {
            $this->redirect(['/account/default/confirm']);
            Yii::$app->end();
        }

        return $model;
    }

    throw new NotFoundHttpException('The requested page does not exist.');
}
0
ответ дан 15 August 2018 в 17:01

Здесь попробуйте проверить !empty() перед доступом $model, например

class BaseController extends Controller
{
    protected function findUser($id)
    {
        if (($model = User::findOne(['id' => $id, 'deleted_at' => null])) !== null) {
            if (!empty($model->confirmed_at)) {
                return $model; 
            } 
            return $this->redirect(['/account/default/confirm']);                
        } else {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
   }
}
0
ответ дан 15 August 2018 в 17:01

Другие вопросы по тегам:

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