password_verify () вход в систему все время - PullRequest
0 голосов
/ 08 февраля 2019

Использование codeigniter хэширует мой пароль с помощью BCRYPT. Кажется, что при каждом входе в систему я перенаправляю на страницу успеха.Таким образом, я полагаю, что проверка пароля не работает, даже если я ввожу неправильный логин, он все еще перенаправляет, также не выдает ошибки form_validation.

Я использовал документацию, чтобы установить его вместе с руководствами по SO.В конце концов пойду к Ion Auth, но хочу знать, как это исправить.Как я все еще учусь код воспламенитель MVC.

Модель

class user_model extends CI_Model{

public function register($encrypt_pass){

$data = array(

'name'=> $this->input->post('name'),
'email'=> $this->input->post('email'),
'username'=> $this->input->post('username'),
'password'=>password_hash($encrypt_pass,PASSWORD_BCRYPT)

);

return $this->db->insert('customers',$data);

}

public function login($username,$password){

//validate the inputs from form
$this->db->where('username',$username);

$query = $this->db->get('customers'); //customers is the table

$result = $query->row_array();

if(!empty($result) && password_verify($password, $result['password'])){


  return $result;

}

else{

return "false";
}

}

}

Контроллер

public function login()
  {

 $this->form_validation->set_rules('username','Username','required');
$this->form_validation->set_rules('password','Password','required');

if($this->form_validation->run()=== FALSE){
$this->load->view('templates/header');
$this->load->view('users/login',$data);
$this->load->view('templates/footer');
}
else {

//Getting username
$username = $this->input->post('Username');

 //Getting and ecrypting password

$password = $this->input->post('Password');//password hashed

$user_id = $this->user_model->login($result);



//checking for user/pass correct will set session if so
 if($user_id){

$this->session->set_flashdata('user_loggedin','You are now logged in');
redirect('posts');
 }

// If combo is incorrect will redirect
else{

$this->session->set_flashdata('user_loggedin','Login Failed, Please Try 
Again');
redirect('users/login');

}

}

}

}

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Вот простой рабочий код входа в систему, есть много способов, как это сделать, это только пример.

НА ВАШЕЙ МОДЕЛИ

Создатьфункция, которая будет проверять / получать пароль пользователя.

public function _getUserPassword($user_name){

    $data = array();

    $this->db->select('PASSWORD');
    $this->db->from('tbl_user');
    $this->db->where('USER_NAME', $user_name);
    $query = $this->db->get();

    if($query->num_rows() > 0){

        foreach($query->result_array() as $field_name => $field_value){
            $data = $field_value;
        }

        return $data;
    }
    else{

        return false;
    }
}

Я видел, что вы просто выбираете его.

Нам нужноиспользуйте эту _getUserPassword функцию, мы называем ее verify function

    function verify($username, $password){

    $data = array();

    $userNameExists = $this->_getUserPassword($username);

    if(password_verify($password, $userNameExists['PASSWORD'])){

        $this->db->select('*');
        $this->db->from('tbl_user AS user');
        $this->db->where('USER_NAME', $username);
        $query = $this->db->get();

        if($query->num_rows() > 0){

            foreach($query->result_array() as $field_name => $field_value){
                $data = $field_value;
            }

            return $data;
        }
        else{

            return false;
        }
    }
    else{

        return false;
    }
}

Так что, если проверка прошла успешно, она вернет данные вашему контроллеру, Давайте использовать вашконтроллер.

Let's assume that you changed the models

НА ВАШЕМ КОНТРОЛЛЕРЕ

public function login()
   {

    $this->form_validation->set_rules('username','Username','required');
    $this->form_validation->set_rules('password','Password','required');

    if($this->form_validation->run()=== FALSE){
    $this->load->view('templates/header');
    $this->load->view('users/login',$data);
    $this->load->view('templates/footer');

}else {

    //Getting username
    $username = $this->input->post('Username');
    //Getting and ecrypting password
    $password = $this->input->post('Password');
    $user_id = $this->user_model->verify($username,$password);

    //checking for user/pass correct will set session if so
    if($user_id){

    $this->session->set_userdata('user_loggedin','You are now logged in');
    redirect('posts');

    }else{
   //DO NOT SET USER DATA SESSION HERE UNLESS IT WILL AUTOMATICALLY LOGGED IN.

    redirect('users/login');

    }
  }
 }

Надеюсь, это поможет!

0 голосов
/ 08 февраля 2019

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

if($user>0){
  if (password_verify($this->input->post('Password'), $user_id['password'])) {
//success message
}
else{
//error message.password is invalid
}
...