2016-05-24 25 views
7

ユーザーがperticularデバイスからログアウトすると、彼は今までにログインしたすべてのデバイスからログアウトします。私はララヴェルでそれをどうやってやるのか。Laravel 5.2 - すべてのデバイスからユーザーをログアウトする方法

私は "predis/predis" をインストールすることにより、セッションではuserIdを保つためのRedisを使用している: "〜1.0"

そして、ここでは、サインインおよびログアウトのための私のコントローラである:

public function postSignIn(Request $request) 
    {  

     if (Auth::attempt(['email' => $request['email'], 'password' =>$request['password'] ])) { 

     $redis = \Redis::connection(); 
     $userId=Session::getId(); 
     $redis->sadd('users:sessions:'.$userId,Session::getId()); 
      return redirect()->route('main'); 

     } 
     return redirect()->back(); 
    } 



public function getLogout() 
{ 
    $redis = Redis::connection(); 
    $userId=Session::getId(); 
    $userSessions = $redis->smembers('user:sessions:' . $userId); 
    $currentSession = Session::getId(); 
    foreach ($userSessions as $sessionId) { 
     if ($currentSession == $sessionId) { 
     continue; 

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

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

それが正常に取得していますログインしてもログアウトしますが、他のデバイスのすべてのセッションを強制終了しません。

どのように問題を解決できますか?

+0

のように見えるだけでgetLogout機能上のライン位置に変更してみてください( 'ユーザー:セッション:' $ userIdを、$セッションIDを); $ redis-> del( 'laravel:'。$ sessionId); –

+0

redis Connectionに問題がありますので、同じ行を変更した後に同じエラーが表示されます。 – Hola

+0

hm 2番目にセッションIDが与えられているがユーザは与えられていないので、$ userId = Session :: getId();の代わりに '$ userId = Auth :: user() - > id;'を使うべきだと思います 私は問題だと思いますが、これはあなたのケースでは1回だけセッションIDを保存します – dyachenko

答えて

3

ので問題は、Redisのキー名のタイプミスをした書き込みデータのための が $redis->sadd('users:sessions:'.$userId,Session::getId()); を使用キーのプレフィックス:'users:sessions:'と取得データ用 $redis->srem('user:sessions:' . $userId, $sessionId);キープレフィックス'user:sessions:' なぜコードが機能せず、dd()が空配列を返したのですか? $ redis-> SREM:

ので、正しいコードは、この

public function postSignIn(Request $request) 
{  

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



public function getLogout() 
{ 
    $redis = Redis::connection(); 
    $userId=Session::getId(); 
    $userSessions = $redis->smembers('user:sessions:' . $userId); 
    $currentSession = Session::getId(); 

    foreach ($userSessions as $sessionId) { 
     if ($currentSession == $sessionId) { 
      continue; 
     } 
      $redis->srem('user:sessions:' . $userId, $sessionId); 
      $redis->del('laravel:' . $sessionId); 
     } 
    Auth::logout(); 
    return redirect()->route('main'); 
} 
3

私はあなたの問題のための提案/回避策を持っている:データベースに格納されていないセッションでの作業

は、**の痛みなので、あなたは問題を解決するために、異なる考えなければなりません。別の解決方法は、ユーザーのログアウト時にユーザーIDと時刻を記録することです。次に、接続が最後のログアウト日付よりも古い場合、ユーザーを切断するミドルウェアを作成します。そしてそれはすべてです。


私のプロトタイプはそうのようになります。
postSignIn方法ラインは、以下のユーザーを記録します(セッション)ログイン日: \Cache::put('last_logout_'.\Auth::id(), time());

:以下、グローバルユーザーのログアウト日時が記録されます

getLogout方法ラインでapp('request')->session()->put('login_date', time());

最終的なタッチは、次のようなコードのミドルウェアです。

if ($user = \Auth::user()) { 
    $login_date  = app('request')->session()->get('login_date'); 
    $last_logout_date = \Cache::get('last_logout_' . $user->id, time() + 100); 
    if ($login_date < $last_logout_date) { 
     \Auth::logout(); 
     //redirect, error message... 
    } 
} 

全コード:

方法:

public function postSignIn(Request $request) 
{ 
    if (Auth::attempt(['email' => $request['email'], 'password' => $request['password']])) { 
     app('request')->session()->put('login_date', time()); 

     return redirect()->route('main'); 
    } 

    return redirect()->back(); 
} 

public function getLogout() 
{ 
    \Cache::put('last_logout_' . \Auth::id(), time()); 
    Auth::logout(); 

    return redirect()->route('main'); 
} 

ミドルウェア:

<?php 

namespace App\Http\Middleware; 

use Closure; 

class LogoutIfExpired 
{ 
    public function handle($request, Closure $next, $guard = null) 
    { 
     if ($user = \Auth::user()) { 
      $login_date  = app('request')->session()->get('login_date'); 
      $last_logout_date = \Cache::get('last_logout_' . $user->id, time() + 100); 
      if ($login_date < $last_logout_date) { 
       \Auth::logout(); 

       return redirect()->route('main'); 
      } 
     } 

     return $next($request); 
    } 
} 
+0

あなたは完全なコードを教えてくれますか?可能であれば 。メイb実際に何を言っているのか分かりません! – Hola

+0

@ x69問題はない、私は私の答えを追加しました。 –

+0

あなたの 'QUEUE_DRIVER'が' sync'でないことも確かめてください。 –

関連する問題