Stack Overflow中也有一些类似的问题,但没有人告诉我如何处理我的问题。
我正在将我的应用程序从CakePHP 1.3迁移到2.x,我对cart有问题。我的用户可以在未登录时将项目添加到购物车中,并且我在登录后合并他们购物车的项目。在1.3中,它工作得很好,因为登录后会话id没有更改,但现在该功能被破坏了,因为用户登录后会话id发生了更改。
有没有办法在登录后留下旧的会话id,或者我需要自己写一些东西?如果是,这里的"最佳实践"是什么?
目前,我将user_id
的身份验证用户和session_id
的匿名用户保存到DB购物车中,登录后,我只按user_id
和session_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是模型名称。