Codeigniter - капча для логина не работает - PullRequest
0 голосов
/ 15 ноября 2018

Я сделал каптч-логин, он работает до сих пор, но есть две проблемы, и эта проблема заключается в том, что сначала, когда ваше имя пользователя или пароль неверны, страница стала пустой.Во-вторых, когда неверны оба имени пользователя, пароль и капча, страница становится пустой

, но когда ваше имя пользователя и пароль верны, а капча неверна, она вызовет echo'captcha is not correct';

function aksi_login(){
        $data = array('username' => $this->input->post('username', TRUE),
                        'password' => md5($this->input->post('password', TRUE))
        );


        $this->load->model('m_model'); // load model_user
        $hasil = $this->m_model->cek_user($data);
        if ($hasil->num_rows() == 1 && $this->input->post('submit')){
            $inputCaptcha = $this->input->post('captcha');
            $sessCaptcha = $this->session->userdata('captchaCode');
            if($inputCaptcha === $sessCaptcha){
            foreach ($hasil->result() as $sess) {
                $sess_data['logged_in'] = 'Sudah Login';
                $sess_data['id_user'] = $sess->uid;
                $sess_data['username'] = $sess->username;
                $sess_data['level'] = $sess->level;
                $this->session->set_userdata($sess_data);
            }


            if ($this->session->userdata('level')=='1') {
                redirect('admin');
            }
            elseif ($this->session->userdata('level')=='2') {
                redirect('guru');
            }       
            elseif ($this->session->userdata('level')=='3') {
                redirect('siswa');
            }

        else {
            echo'username or password is wrong'
        }
    }
    else{
                echo "captcha code is not correct";
            }
    }
}

Я думаю, что пока из-за кода контроллера, и я внес некоторые изменения, я попытался поставить еще один, например

elseif ($this->session->userdata('username')== FALSE && $this->session->userdata('password')==FALSE){
echo'username or password is wrong';
}
else {
            echo'username or password is wrong';
    }

, но, к сожалению, не работает

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Мое предложение переписать ваш контроллер и использовать проверку формы, поскольку она также является стандартной библиотекой codeigniter. Проверьте официальную документацию здесь https://www.codeigniter.com/userguide3/libraries/form_validation.html

//your validation config should be something like this
public function login() {
  $form_rules = [
            [
                'field' => 'username',
                'label' => 'Username',
                'rules' => 'required',
            ],
            [
                'field' => 'password',
                'label' => 'Password',
                'rules' => 'required',
            ],
            [
                'field' => 'captcha',
                'label' => 'No HP',
                'rules' => 'rules' => 'required|callback_check_captcha'
            ],

  ];

  $this->form_validation->set_rules($this->form_rules);

  if ($this->form_validation->run() == TRUE) {
    //check username & password
    //if you're sure that username is unique, you can directly get 1 data with ->row()
    $check = $this->m_model->cek_user($data)->row();

    if($check) {
       switch($check->level) {
         case '1' :
           break;
         case '2' : 
         ......
         ......
       }
    } else {
        //wrong username / password
    }

  } else {
    //show login form with view
  }

}

/*callback fro form validation*/
public function check_captcha($str) {
if(!empty($this->session->cap_word)) {
    $expiration = time() - $this->config->item('captcha_expiration');
    if($this->session->cap_time > $expiration) {
        if($this->session->cap_word == $str) {
            return TRUE;
        } else {
            $this->form_validation->set_message('check_captcha', 'Wrong captcha.');
            return FALSE;
        }

    } else {
        $this->form_validation->set_message('check_captcha', 'Session captcha expired.');
        return FALSE;
    }

} else {
    $this->form_validation->set_message('check_captcha', 'KWrong captcha.');
    return FALSE;
}
}
0 голосов
/ 16 ноября 2018

Лучше сначала проверить на наличие капчи в отдельном условии, затем проверить на валидацию, поэтому, если у вас все в порядке, и с вашими пост-значениями все в порядке, вы должны сделать это следующим образом:

if (this->captcha_validation($this->input->post('captcha')))
{
    $this->form_validation->set_rules($this->rules);
    if ($this->form_validation->run() === TRUE)
    {
        $username = $this->input->post('username');
        $password = $this->input->post('password');
        // your magic
    }
    else
    {
        // array of validation errors
        validation_errors = $this->form_validation->error_array();
    }
}
else
{
    // wrong captcha
    $this->recaptcha();
}

Теперь вы выделили две проверки и упростили процедуру повторного ввода кода, но, что более важно, вам не нужно выполнять проверку формы, если в первую очередь введен неверный код проверки.

...

Не уверен, как работает ваш код, но в // your magic есть ваша логика:

$this->load->model('m_model'); // load model_user
$hasil = $this->m_model->cek_user($data);
if ($hasil->num_rows() > 0)
{
    foreach ($hasil->result() as $sess) 
    {
        $sess_data['logged_in'] = 'Sudah Login';
        $sess_data['id_user'] = $sess->uid;
        $sess_data['username'] = $sess->username;
        $sess_data['level'] = $sess->level;
        $this->session->set_userdata($sess_data);
    }
    if ($this->session->userdata('level') == '1') 
    {
        redirect('admin');
    }
    elseif ($this->session->userdata('level') == '2') 
    {
        redirect('guru');
    }       
    elseif ($this->session->userdata('level')=='3') 
    {
        redirect('siswa');
    }
}
...