在codeigniter中Bcrypt检查密码

时间:2016-11-30 14:33:55

标签: php codeigniter bcrypt

使用bcrypt解密密码时遇到问题。我使用此代码时无法登录。那么,有什么错误吗?

function login(){

    if ($this->session->userdata('username')) 
    {   
        redirect('dasbor');
    }

    //fungsi login
    $valid = $this->form_validation;
    $username = $this->input->post("username");
    $password = $this->input->post("password");

    $hash = $this->db->get('users')->row('password');

    $hashp = $this->bcrypt->check_password($password,$hash);


        $valid->set_rules("username","Username","required");
        $valid->set_rules("password","Password","required");

    if ($hashp) {
        if($valid->run()) {
        $this->simple_login->login($username,$hashp, base_url("dasbor"), base_url("Auth/login"));
        }
    }
    // End fungsi login

    $data = array('title'=>'Halaman Login Admin');
    $this->load->view('admin/login_view',$data);
}

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:2)

我知道这是一个老问题,但我想帮助其他面临相同问题的人。

首先,您需要对算法进行重新处理。 password_verify()函数需要2个参数:

  1. Password,即用户提交表单之前在文本字段中输入的文本。
  2. Hash,已经存储在数据库中的哈希。

目标是验证PasswordHash是否相似。如您所知,即使您对相同的字符串进行哈希处理,password_hash()也会在不同的时间返回不同的结果。因此,您不能使用this->db->where()有效记录。

所以,我要做的是以下两个简单的步骤:

在模型中创建一个函数(例如Main_model.php)以获取用户数据。

public function get_user($user) {
        $this->db->where('username', $user);

        return $this->db->get('user')->row_array();
    }

从控制器获取密码并使用password_verify

$get_user = $this->main_model->get_user($this->input->post('username'));

if(password_verify($this->input->post('password'), $get_user['password'])){
// Success
}
else {
// Not Success
}

还有一个提示,不要在Controller中写入任何活动记录。 MVC方法并不整齐。