captcha not working using scenarios in yii2

386 Views Asked by At

I am trying to add captcha validation based on scenario, for which I am first retrieving number of failed attempts from database. For which I am using checkattempts() function. Based on the result I am displaying captcha in view and adding scenario condition in controller as below.

In LoginForm model:

public function rules()
{
    return [
        [['username', 'password'], 'required', 'on'=>'loginpage'],
        [['username', 'password'], 'required', 'on'=>'withCaptcha'],
        [['reference_url'], 'safe'],
        [['verifyCode'], 'captcha', 'skipOnEmpty' => true,'on'=>'withCaptcha'],         
        ['username','email', 'on'=>'loginpage', 'message'=> 'Please enter a valid email address'],
        ['password', 'validatePassword', 'on'=>'loginpage'],
        ['password', 'validatePassword', 'on'=>'withCaptcha'],
    ];
}

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

in SiteController.php controller

 public function actionLogin() {
    if (!\Yii::$app->user->isGuest) {
        return $this->redirect(Yii::$app->getUrlManager()->getBaseUrl() . '/../../');
    }
    $model = new \common\models\LoginForm();
    $model->scenario = 'loginpage';
    $captcha = false;
    if(Yii::$app->request->post()){
    $post_variables =Yii::$app->request->post('LoginForm');         
        if ($model->checkattempts($post_variables['username'])) {
            $model->scenario = 'withCaptcha'; 
            $captcha = true;
        }
    }
    if ($model->load(Yii::$app->request->post()) && $model->validate()) {
         $model->login(); print_r($model->getErrors()); exit;
    } else {
        return $this->render('login', [
                    'model' => $model, 'captcha' => $captcha,
                ]);
    }

In my login.php view:

 <?php if($captcha) { ?>
            <?= $form->field($model, 'verifyCode')->widget(Captcha::className(), 
        ['template' => '<div class="captcha_img">{image}</div>'
            . '<a class="refreshcaptcha" href="#">'
            . Html::img('/images/imageName.png',[]).'</a>'
            . 'Verification Code{input}',
        ])->label(FALSE); ?>   
            <?php } ?>

In my controller when I am tring to print model errors at $model->login() function it is giving below error everytime even though the verification code is correct.

Array ( [verifycode] => Array ( [0] => The verification code is incorrect. ) )

Why is it failing every time. Is there any mistake in the code written?

Thanks in advance

0

There are 0 best solutions below