登录CakePHP后保留会话id


Preserve session id after login CakePHP

Stack Overflow中也有一些类似的问题,但没有人告诉我如何处理我的问题。

我正在将我的应用程序从CakePHP 1.3迁移到2.x,我对cart有问题。我的用户可以在未登录时将项目添加到购物车中,并且我在登录后合并他们购物车的项目。在1.3中,它工作得很好,因为登录后会话id没有更改,但现在该功能被破坏了,因为用户登录后会话id发生了更改。

有没有办法在登录后留下旧的会话id,或者我需要自己写一些东西?如果是,这里的"最佳实践"是什么?

目前,我将user_id的身份验证用户和session_id的匿名用户保存到DB购物车中,登录后,我只按user_idsession_id找到购物车,合并项目,然后用session_id删除购物车,但由于session_id的更改,现在无法做到这一点。

如果您查看AuthComponent的源代码,您可以看到它是cake 2.x中的默认行为,以防止会话固定。我认为最简单的解决方案是在调用登录操作之前读取会话数据,并在成功时将数据写入或合并回新会话。如果您需要保留旧的会话id,请在登录后将其添加到会话中。

if ($this->Session->check('Cart.session_id')) {
    $sessionId = $this->Session->read('Cart.session_id');
} else {
    $sessionId = session_id();
}
$userId = $this->Session->read('Cart.user_id');
if ($this->Auth->login()) {
    // on successful login find your customer in DB and merge the session data like you did
    ...
    // in the case you need to keep the session_id for reference...
    $this->Session->write('Cart.session_id') = $sessionId;
}

希望它能帮助。。。

update-如果您不能像我展示的那样使用它,更简单的选择是在插入或更新用户订单详细信息的同时,将session_id()存储在会话中。所以只有这个片段:

if (!$this->Session->check('Cart.session_id')) {
    $this->Session->write('Cart.session_id', session_id());
}

此信息将与会话一样有效,或者直到您取消设置为止。

当你登录时,你会创建一个会话,所以要从会话中读取数据,你可以这样读取:

$this->Session->read('Auth.User.user_id);

User是模型名称。