会话因在Codeigniter中重新生成会话ID而迷路

时间:2019-03-22 11:57:17

标签: php codeigniter

我有一个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);之前添加重新生成行。上面的代码无需重新生成即可完美运行。

此外,我正在使用数据库会话驱动程序。当我切换到文件驱动程序时,即使重新生成逻辑也可以正常工作。这只是数据库驱动程序引起的(我认为)是导致此问题的原因。

1 个答案:

答案 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系统中时,问题立即得到解决!