CodeIgniter 登录功能表单不起作用

问题描述

我总结了这是我的登录功能代码,我使用的是 CodeIgniter 框架。我试图让用户使用他们的电子邮件和密码登录。我正在尝试使用 bcrypt 哈希密码登录,但我的编码肯定有问题,因为它没有记录并且一直显示无效。

public function login()
{

    if ($this->session->userdata('logged_in') == 1 
        && in_array($this->session->userdata('user_type'),['Admin','Member']) {
            redirect('dashboard','location');
    }

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


    if ($this->form_validation->run() == false) {
        $this->login_page();
    } else {
        $this->csrf_token_check();

        $username = ($this->input->post('username',true));
        $password = ($this->input->post('password',true));
          
        $table = 'users';

        if($this->config->item('master_password') != '') {
            if ($_POST['password']) {
                $where['where'] = array('email' => $username); //master password
            } else {
                $where['where'] = array('email' => $username,'password' => $password);
            }
        } else {
            $where['where'] = array('email' => $username,'password' => $password);
        }


        $info = $this->basic->get_data($table,$where,$select = '',$join = '',$limit = '',$start = '',$order_by = '',$group_by = '',$num_rows = 1);

        $count = $info['extra_index']['num_rows'];

        if ($count == 0) {
            $this->session->set_flashdata('login_msg',$this->lang->line("invalid email or password"));
            redirect(uri_string());
        } else {
            $username = $info[0]['name'];

            if ($logo=="") {
                $logo=base_url("assets/img/avatar/avatar-1.png");
            } else {
                $logo=base_url().'member/'.$logo;
            }

            $this->session->set_userdata('logged_in',1);
            $this->session->set_userdata('username',$username);

            $this->basic->insert_data('user_login_info',$login_info_insert_data);

            $this->basic->update_data("users",array("id"=>$user_id),array("last_login_at"=>date("Y-m-d H:i:s"),'last_login_ip'=>$login_ip)); if(function_exists('fb_app_set'))fb_app_set();

            if ($this->session->userdata('logged_in') == 1 
                && in_array($this->session->userdata('user_type'),'Member']) {
                redirect('dashboard','location');
            }
        }
    }
}

解决方法

这个答案是针对 CI3 的,因为你没有提到版本。

首先,我认为您将 $username 用于 DB 中的 email 字段很奇怪。您可以更正您的命名约定。

我认为这段代码一定给你带来了问题

if($this->config->item('master_password') != '')
            {
                if(($_POST['password']))
                $where['where'] = array('email' => $username); //master password
                else $where['where'] = array('email' => $username,'password' => $password);
            }
            else $where['where'] = array('email' => $username,'password' => $password);

如果您在 CI 中直接使用上述 $where 作为 $this->db->where($where),您的代码应该是

if($this->config->item('master_password') != '')
            {
                if(($_POST['password']))
                $where = array('email' => $username); //master password
                else $where = array('email' => $username,'password' => $password);
            }
            else $where = array('email' => $username,'password' => $password);

注意,我从 where 数组中删除了 $where 键。

此外,如果您使用 bcrypt 在 db 中存储密码,则必须先获取行,然后像这样比较密码:

    $where = array('email' => $username);
    $info = $this->basic->get_data($table,$where,$select = '',$join = '',$limit = '',$start = '',$order_by = '',$group_by = '',$num_rows = 1);

    if ($this->bcrypt->check_password($password,$info[0]['password'])) {
        //We're good,login to the system
    } else {
        //Wrong password
    }

我认为,您的其他代码(如 $this->basic->get_data 函数)也应该进行审查。要调试,请尝试将 var_dump($info[0]); 放在此函数之后,您将知道是否有该行。

此外,您可以使用 $str = $this->db->last_query(); 打印出上次运行的查询。