2015-06-16 44 views
2

用戶已登錄。他還已登錄到3臺不同的計算機。 現在用戶更改他的密碼。Laravel 5 - 從所有設備上註銷用戶

我想做點什麼讓他從他所有的設備中註銷。默認情況下,如果我們在一臺設備上更改密碼,其他設備上不會出現任何問題

首先要記住的是在中間件(每個請求)中檢查密碼是不好的,並顯着降低性能。

我如何在Laravel 5中做到這一點?

AND這樣做的最好方法是什麼?大型網站如何從所有設備註銷用戶?

+0

是否有可能獲得通過用戶ID的會話?這樣,如果用戶更改密碼,您可以檢查他們是否有其他活動的會話,然後將其刪除? – haakym

+0

你使用什麼類型的會話驅動程序? – baao

+0

@michael我正在使用memcached – Sky

回答

1

我做了類似的事情。起初,我在Redis中保存會話。對於每次登錄,我都會在成功認證後保存會話ID,並將其與用戶ID(它是數組)關聯起來。如果用戶更改密碼,則可以刪除除當前的所有用戶會話(使用會話ID)。如果用戶註銷,您可以從用戶會話數組中刪除會話ID。 (我想你可以使用MySQL或其他存儲保存用戶和會話ID之間的關係)

爲救我使用會話ID(用戶登錄)

$redis = \LRedis::connection(); 
$redis->sadd('user:sessions:' . $userId, Session::getId()); 

用於刪除會話ID從用戶會話的陣列(如果用戶註銷或手動註銷)

$redis->srem('user:sessions:' . $userId, $sessionId); 

除去Laravel會話(從其他設備註銷用戶)

$redis->del('laravel:' . $sessionId); 

獲取用戶

$redis->smembers('user:sessions:' . $userId); 

所有會話ID爲註銷所有設備都使用循環

$userSessions = $redis->smembers('user:sessions:' . $userId); 
$currentSession = Session::getId() 
foreach ($userSessions as $sessionId) { 
    if ($currentSession == $sessionId) { 
     continue; //if you want don't remove current session 
    } 

    $redis->del('laravel:' . $sessionId); 
    $redis->srem('user:sessions:' . $userId, $sessionId); 
} 
+0

我已經實現了你所建議的同樣的過程,但是我面臨着以下錯誤。請你幫我找出答案。 ConnectionConnection.php中的ConnectionException第168行:由於目標機器主動拒絕它,因此無法建立連接。 [tcp://127.0.0.1:6379]' – Hola

+0

嗨嘗試連接到redis使用redis cli'redis-cli' – dyachenko

+0

我已經更新了幾乎相同的問題。你能幫我找出答案嗎? http://stackoverflow.com/questions/37405740/laravel-5-2-how-to-logout-a-user-from-all-of-his-devices – Hola