Как добавить капчу требуется только для определенного условия yii2 - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь сделать поле для ввода каптчи обязательным, только если количество неудачных попыток входа в систему превышает 3 раза.Для которого я написал код ниже до сих пор.

В модели LoginForm я добавил следующие правила

 public function rules()
 {
    return [
        [['username', 'password'], 'required'],
        ['password', 'validatePassword'],
        ['verifyCode', 'captcha', 'when' => function($model) {
            return $this->checkattempts();
        }],
    ];
 }

  public function validatePassword($attribute, $params)
{
    if (!$this->hasErrors()) {
        $user = $this->getUser();
        if (!$user || !$user->validatePassword($this->password)) {
        $this->addLoginAttempt($user->id);
        $this->addError($attribute, 'Incorrect username or password.');
        }
    }
}

 public function checkattempts()
  {
    $user = $this->getUser();
    $ip = $this->get_client_ip();
    $data = (new Query())->select('*')  
                ->from('login_attempts')
                ->where(['ip' => $ip])->andWhere(['user_ref_id' => $user->id])
                ->one();
    if($data["attempts"] >=3){
        return false;
    }else{
        return true;
    }
}   

public function addLoginAttempt($uid) {
    $ip = $this->get_client_ip();
   $data = (new Query())->select('*')   
                ->from('login_attempts')
                ->where(['ip' => $ip])->andWhere(['user_ref_id' => $uid])
                ->one();
   if($data)
   {
     $attempts = $data["attempts"]+1; 
        @Yii::$app->db->createCommand("UPDATE login_attempts SET attempts=".$attempts." where ip = '$ip' AND user_ref_id=$uid")->execute();
   }
   else {
    Yii::$app->db->createCommand("INSERT into login_attempts (attempts, user_ref_id, ip) VALUES(1,'$uid', '$ip')")->execute();
   }
 }

Здесь я сначала проверяю пароль.Если пароль неверный, то я увеличиваю счет на 1. Эта часть работает нормально.Количество успешно увеличивается.

После этого я пытаюсь подсчитать количество неудачных попыток при проверке капчи с помощью функции checkattempts(), но она не работает.

Может кто-нибудь сказать, пожалуйста, где я допустил ошибку?.

Заранее спасибо.

1 Ответ

0 голосов
/ 22 мая 2018

В вашей модели:

if (!$model->checkattempts())
//show the captcha

Тогда в правилах вашей модели вам понадобится что-то вроде:

['captcha', 'captcha'],

В вашем случае вы можете использовать разные сценариив зависимости от попыток пользователя и в одном сценарии (более X попыток) необходимо ввести капчу.

Дополнительная документация о капче и о сценариях .

...