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 登录功能表单不起作用的主要内容,如果未能解决你的问题,请参考以下文章