CodeIgniter 登录功能表单不起作用

Posted

技术标签:

【中文标题】CodeIgniter 登录功能表单不起作用【英文标题】:CodeIgniter Login function form not working 【发布时间】:2021-04-11 15:02:09 【问题描述】:

我总结了这是我的登录功能代码,我正在使用 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'), ['Admin', 'Member']) 
                redirect('dashboard', 'location');
            
        
    

【问题讨论】:

【参考方案1】:

这个答案是针对 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(); 打印出上次运行的查询。

【讨论】:

谢谢你,我正在尝试这个并让你知道,当我提到 bcrypt 时它说函数未定义 我试过了,即使密码不正确@jazeabby也可以登录 对于 bcrypt ,尝试使用这个:if( password_hash($password, PASSWORD_BCRYPT) == $info[0]['password']) 我做了一些改变,我添加了 md5 " $password = md5($this->input->post('password', true)); $table = 'users'; if($this ->config->item('master_password') != '') if(md5($_POST['password'])) $where['where'] = array('email' => $username); / /master 密码 else $where['where'] = array('email' => $username, 'password' => $password); else $where['where'] = array('email' => $username , '密码' => $密码);"它可以工作,但现在只能获取 md5,我需要 bcrypt 你能分享一个示例字符串,密码是如何存储在数据库中的?如果是 $2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K 之类的,上面应该可以工作

以上是关于CodeIgniter 登录功能表单不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 Codeigniter 中检查登录和重定向不起作用?

表单操作在 codeigniter 中不起作用

Jquery 选择器在引导模式下不起作用(使用 codeigniter 加载表单)

登录验证在CodeIgniter中不起作用

忘记密码功能在 CodeIgniter 中不起作用

CodeIgniter 会话类在 Chrome 中不起作用