Yii2 登录账号密码多次输入错误,显示验证码

这里主要实现多次输入账号信息错误的情况下,才会显示验证码并进行验证,利用session保存login_error_times登录错误次数,部分代码如下:
controller

public function actionLogin()
{
    if (!Yii::$app->user->isGuest) {
        return $this->goHome();
    }
    
    $model = new LoginForm();
    if (Yii::$app->session['login_error_times'] >= $model->errorMaxTimes) {
        $model->scenario = 'loginError';
    }

    $model->rememberMe = false;
    if ($model->load(Yii::$app->request->post()) && $model->login()) {
        Yii::$app->session->remove('login_error_times');
        return $this->goBack();
    } else {
        return $this->render('index', [
            'model' => $model,
        ]);
    }
}

model

// 验证规则
public function rules()
{
    return [
        // username and password are both required
        [['username', 'password'], 'required'],
        ['username', 'match', 'pattern' => '/^1[34578]\d{9}$/', 'message' => '{attribute}不正确'],
        // rememberMe must be a boolean value
        ['rememberMe', 'boolean'],
        // password is validated by validatePassword()
        ['password', 'validatePassword'],

        ['verifyCode', 'required', 'on' => 'loginError'],
        ['verifyCode', 'captcha', 'on' => 'loginError'],
    ];
}

// 账号密码验证
public function validatePassword($attribute, $params)
{
    if (!$this->hasErrors()) {
        $user = $this->getUser();
        if (!$user || !$user->validatePassword($this->password)) {
            $this->addError($attribute, '用户名或密码错误.');
            $errorTimes = Yii::$app->session['login_error_times'];
            $errorTimes++;
            Yii::$app->session['login_error_times'] = $errorTimes;
         }
    }
}

// 登录
public function login()
{
    if ($this->validate()) {
        return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0);
    } else {
        return false;
    }
}

protected function getUser()
{
    if ($this->_user === null) {
        $this->_user = User::findByUsername($this->username);
    }

    return $this->_user;
}

html页面

session['login_error_times'] >= $model->errorMaxTimes) { ?>
    field($model, 'verifyCode')
        ->widget(Captcha::className(), [
            'template' => '{input}{image}',
            'options' => ['type' => 'number', 'class' => 'valid', 'placeholder' => '请输入验证码'],
        ]) ?>

你可能感兴趣的:(Yii2 登录账号密码多次输入错误,显示验证码)