2016-05-26 28 views
3

我正在構建一個用戶登錄其他設備並在註銷時註冊的laravel應用程序,我想強制他也從其他設備註銷。我如何在laravel中實現。Laravel 5 - 如何從使用Redis的所有設備註銷用戶

我個人使用過Redis服務器。在運行程序時,我也運行redis-server.exe。而且我在Windows中。 我已經改變了.ENV文件還與CACHE_DRIVER=redis SESSION_DRIVER=redis 除了Redis的已經與laravel裝我也裝"predis/predis": "~1.0"

,這裏是我的控制,我已經從其他設備註銷書面登錄迫使用戶。

在登錄控制器時,我dd()$redis我看到爲該用戶創建的會話,但當我登錄和何時註銷我dd()$userSessions但看到空,所以它意味着沒有存儲在會話表中以比較。

如果有人找到任何解決方案,請幫我找出答案。提前致謝。

控制器:

public function postSignIn(Request $request) 
    {  

    if (Auth::attempt(['email' => $request['email'], 'password' =>$request['password'] ])) { 
     $redis = \Redis::connection(); 
     $userId = Auth::user()->id; 
     $redis->sadd('users:sessions:' . $userId,Session::getId());  
     return redirect()->route('main'); 
    } 
    return redirect()->back(); 
} 



public function getLogout() 
{ 
    $redis = Redis::connection(); 
    $userId =Auth::user()->id; 
    $userSessions = $redis->smembers('user:sessions:' . $userId); 
    $redis->sadd('users:sessions:'.$userId,Session::getId()); 
    $currentSession = Session::getId(); 
    foreach ($userSessions as $sessionId) { 
     if ($currentSession == $sessionId) { 
     continue; 
     } 
     $redis->srem('user:sessions:' . $userId, $sessionId); 
     $redis->del('laravel:' . $sessionId); 
     \Session::setId($sessionId); 
     \Session::clear(); 
    } 
    Auth::logout(); 
    return redirect()->route('main'); 
} 

回答

0

使用Redis的使用Laravel可以使用某事像這樣:

// During LogIn 
Cache::tags(['sessions', auth()->id])->forever('session:'.auth()->id, Session::getId()); 

// Logout 
Cache::tags([auth()->id])->flush(); 

標籤允許你刪除存儲與具體標籤的所有密鑰。

[更新]

你必須適應會話變量名。

public function postSignIn(Request $request) 
{ 

    if (Auth::attempt(['email' => $request['email'], 'password' =>$request['password'] ])) { 
     $userId = Auth::user()->id; 
     \Cache::tags(['sessions', 'session_'.$userId])->forever('users:sessions:' . $userId, Session::getId()); 
     return redirect()->route('main'); 
    } 
    return redirect()->back(); 
} 



public function getLogout() 
{ 
    $userId =Auth::user()->id; 

    $sessionId = \Cache::get('users:sessions:' . $userId); 
    \Cache::tags(['session_'.$userId])->flush(); 
    \Session::setId($sessionId); 
    \Session::clear(); 

    Auth::logout(); 
    return redirect()->route('main'); 
} 
+0

如何刪除在登出控制器登錄時創建的會話? 我已經用你的代碼替換了,實際上沒有任何改變。 – User57

+0

我已經更新了完整代碼的答案。 – Pyton

+0

我已經改變了你的代碼,但沒有得到真正的感謝改變,雖然幫助! – User57