我有一个codeigniter应用程序,在该应用程序中,当用户登录时设置了会话,并向用户显示了如下所示的代码:
public function checkLogin()
{
$username = $this->input->post("username");
$password = $this->input->post("password");
$userId = $this->ModelLogin->checkLogin($username, $password);
if ($userId) {
$session_data = array(
'is_logged_in' => true,
'userId' => $userId,
);
$this->session->set_userdata($session_data);
redirect("/user/dashboard");
} else {
$this->session->set_flashdata('login_error', "Incorrect username/password");
}
}
现在,我要在验证用户身份之前通过重新生成会话ID来解决会话修复问题。当我包含session_regenerate_id()
或什至是特定于代码点火器的$this->session->sess_regenerate()
函数时,它都在该函数中起作用,但是一旦将其重定向到/user/dashboard
,会话数据便会变为空白。
我要在$this->session->set_userdata($session_data);
之前添加重新生成行。上面的代码无需重新生成即可完美运行。
此外,我正在使用数据库会话驱动程序。当我切换到文件驱动程序时,即使重新生成逻辑也可以正常工作。这只是数据库驱动程序引起的(我认为)是导致此问题的原因。
答案 0 :(得分:0)
经过几天的反复试验,我已解决了这个问题。
这在Codeigniter 3.0.x中也存在,在PHP 7.x上也是如此(这是我的应用程序所运行的)
经过大量搜索,我偶然发现了Codeigniter更改日志,其中提到了Codeigniter的某些更高版本(3.0.x)中的回归错误修复,这就是我开始浏览Codeigniter会话库和数据库驱动程序中的更改时所使用的找到了以下代码段:
// PHP7 will reuse the same SessionHandler object after
// ID regeneration, so we need to explicitly set this to
// FALSE instead of relying on the default ...
$this->_row_exists = FALSE;
当我仅将这行更改引入到现有的codeigniter系统中时,问题立即得到解决!