这里主要实现多次输入账号信息错误的情况下,才会显示验证码并进行验证,利用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页面
<?php if (Yii::$app->session['login_error_times'] >= $model->errorMaxTimes) { ?>
<?= $form->field($model, 'verifyCode')
->widget(Captcha::className(), [
'template' => '{input}{image}',
'options' => ['type' => 'number', 'class' => 'valid', 'placeholder' => '请输入验证码'],
]) ?>
<?php } ?>
加我微信公众号【皮蛋馅儿】,一起学习哦~