2013-10-22 46 views
5

我試圖實現一個用戶策略,只有一個用戶可以一次登錄。我試圖在Laravel的Auth驅動程序之上構建它。在Laravel單一會話登錄

我想過使用會話驅動程序將會話存儲在數據庫中,並使每個用戶名的密鑰不變。由於會話固定,這可能是一個糟糕的實施。

實施會是什麼樣子?我應該編輯哪些Auth驅動程序中的方法?普通會話密鑰存儲在哪裏?

回答

13

我最近做了這個。

我的解決辦法是設置會話值時,用戶登錄然後我有一個小的類檢查是否存儲會話ID是一樣的誰是登錄的當前用戶。

如果用戶登錄來自其他地方的數據庫中的會話ID將更新,並且「舊」用戶將被註銷。

我並沒有改變身份驗證的驅動程序或任何東西,只是把它放在上面當用戶登錄下面發生在登錄成功:

$user->last_session = session_id(); 
$user->save(); 

要檢查會話是我下面所使用的有效

if(session_id() != Auth::user()->last_session){ 
    Auth::logout(); 
    return true; 
} 

正如你可以看到我在用戶表中添加一列名爲last_session

+0

我猜你把「檢查會話是否有效」在驗證過濾器的一部分?謝謝,我在Auth驅動程序中都混淆了,但這更簡單。 –

+0

@JosephSzymborski是的。有時你只需要朝正確的方向推進。我實際上做了一個新的類來檢查會話是否有效。每次用戶訪問一組需要登錄的路由/過濾器時,都會調用該類。 –

+0

獲得Laravel會話ID可以在Laravel 4中以這種方式完成。對於Laravel 3($ _COOKIE [「laravel_session」])和Laravel> = 4.1(Session :: getId()),還有另一種方法。積分到http://stackoverflow.com/questions/16812747/how-can-i-get-the-session-id-in-laravel – Jos