PHP Laravel:如何有力地使用相同的userId从其他设备注销

时间:2016-05-25 05:19:43

标签: php laravel laravel-5 redis

我正在构建一个laravel应用程序,其中一个用户登录了其他设备并且在注销时我想强迫他从其他设备注销。 我如何在laravel中实现。

就我个人而言,我已经使用过Redis Server。但我不知道为什么它不起作用。在运行程序时,我也运行了redis-server.exe。我在Windows中。这是我的控制器,我写了登录,强制用户从其他设备注销。如果有人找到任何解决方案,请帮助我找到它。谢谢你提前。

控制器:

  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);
    }
    Auth::logout();
    return redirect()->route('main');
}

1 个答案:

答案 0 :(得分:0)

当你循环每个用户会话时,用它的ID加载它并清除其中的所有数据:

    foreach ($userSessions as $sessionId) {
        if ($currentSession == $sessionId) {
            continue;
        }
        $redis->srem('user:sessions:' . $userId, $sessionId);
        $redis->del('laravel:' . $sessionId);
        \Session::setId( $sessionId ); //ADD THIS
        \Session::clear(); //ADD THIS
    }