【问题标题】:Session getting lost on regenerating session id in codeigniter在 codeigniter 中重新生成会话 ID 时会话丢失
【发布时间】:2019-08-13 09:52:25
【问题描述】:

我有一个 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() 甚至是codeigniter 特定的$this->session->sess_regenerate() 函数时,它可以在这个函数中工作,但是一旦它被重定向到/user/dashboard,会话数据就会变为空白。

我在 $this->session->set_userdata($session_data); 之前添加了 regenerate 行。上面的代码无需重新生成即可完美运行。

另外,我正在使用 database 会话驱动程序。当我切换到文件驱动程序时,即使重新生成逻辑也能完美运行。只是数据库驱动程序(我觉得)导致了这个问题。

【问题讨论】:

标签: php codeigniter


【解决方案1】:

经过几天的反复试验,我解决了这个问题。

这出现在 Codeigniter 3.0.x 中,也出现在 PHP 7.x 上(这是我的应用程序运行的平台)

经过大量搜索,我偶然发现了 Codeigniter 更改日志,其中提到了 Codeigniter 的某些更高版本 (3.0.x) 中的回归错误修复,那时我开始扫描 Codeigniter 会话库和数据库驱动程序中的更改找到了这个 sn-p:

// 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 系统时,问题立即解决了!

【讨论】:

    猜你喜欢
    • 2017-03-27
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    相关资源
    最近更新 更多