2014-09-05 198 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