2014-09-05 99 views
1

Stack Overflow中有一些类似的问题,但没有人给我一个线索如何处理我的问题。登录后保留会话ID CakePHP

我将我的应用程序从CakePHP 1.3迁移到2.x,并且我的购物车有问题。我的用户可以在未登录的情况下将商品添加到购物车,并在登录后合并购物车的商品。在1.3版本中,它运行良好,因为会话ID在登录后没有改变,但现在该功能被破坏,因为会话ID在用户登录后被更改。

有没有办法在登录后留下旧的会话ID或我需要自己写点东西?如果是这样,那么在这里最好的做法是什么?

目前我保存到数据库推车authentificated用户与他们的user_id,并为匿名用户与他们的session_id并登录后,我就发现车被user_idsession_id,合并项目,比session_id删除车,但现在是不可能做到的,因为session_id更改。

同比当日志中创建一个会话
+1

您可以在会话中为未经验证的用户保存购物车信息,登录后不会丢失它。 – ADmad 2014-09-05 17:49:30

+0

谢谢,这让我很惊讶。我没有检查过这个案例,因为改变了'session_id',所以我相信会话数据也丢失了。但现在我只是在AppController中将匿名'session_id'保存到'Session'中,并且每次检查它是否设置并且用户都被验证了,我正在使用'session_id'合并购物车的商品而不是当前。虽然接受的答案是正确的,我不能使用这种方法,因为我的应用程序中有多个登录方法。 – Yaroslav 2014-09-06 00:08:40

+0

出于安全原因,Auth组件在登录后重新生成会话ID。会话数据在PHP重新生成新会话ID时保留。您遇到问题的唯一原因是您使用陈旧的会话ID。在保存数据库中未认证用户的购物车方面,我看不到什么好处。保持会话,然后在登录后坚持数据库。 – ADmad 2014-09-06 08:28:14

回答

0

如果你看看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; 
} 

希望它可以帮助...

更新 - 如果你不能使用它像我发现,即使是简单的选择是存储会话内session_id(),在同一时间,当你插入或更新用户的订单详情。所以只是这个片段:

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

这个信息只会在会话期间存在,或者直到你解除它。

+0

这有点过头了。我相信只有'if sessionId = session_id();'和'if($ this-> Auth-> login())'后面才可以使用它来代替实际会话ID来合并我的购物车项目。所以在这里使用'Session'是没用的。但我会接受你的答案,因为这是正确的,我做了这样的事情。谢谢。 – Yaroslav 2014-09-06 00:02:36

+0

是的,我不确定整个用例,所以我增加了更多的需要。但是,如果session_id没有设置,为什么不把session_id存储在会话中?通过这样做,会话重新生成不是问题,您不需要AppController中的任何额外逻辑,并且您只需执行'$ this-> Session-> read('your_session_id')'您需要它的地方...... – lp1051 2014-09-06 00:36:23

-1

,所以要读会话数据,你可以这样阅读:

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

用户是型号名称。

+0

我需要在*用户登录之前获得会话的'session_id'。或者在用户登录后保存同样的'session_id'。 – Yaroslav 2014-09-05 17:08:57

+0

如果我们在登录后保留会话数据的情况下考虑该评论,同时更改'session_id'以便答案不像以前那样不正确。 – Yaroslav 2014-09-06 00:11:49