【问题标题】:PHP Laravel : How to logout from other device with same userId forcefullyPHP Laravel:如何从具有相同用户ID的其他设备强制注销
【发布时间】:2016-09-22 12:58:20
【问题描述】:

我正在构建一个 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');
}

【问题讨论】:

  • 如果我错了,请纠正我,但如果 R​​edis 存储类像这样$redis->sadd($key, $value); 工作,那么您只存储一个会话 ID,并且每个人都记录您正在覆盖前一个。
  • 不,因为我有 dd() o/p 和不同的会话 ID。
  • 您是否将 config/session.php 中的会话驱动程序更改为 Redis,或者您只是使用 Redis 外观来存储会话 ID?
  • 在 config/session.php 我已将其更改为 'driver' => env('SESSION_DRIVER', 'redis'), 问题是 Redis 没有在 Session 表中保存任何值我不知道为什么。
  • 在你.env 文件中你有SESSION_DRIVER=redis吗?

标签: php laravel laravel-5 redis


【解决方案1】:

当您循环每个用户会话时,通过它的 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
    }

【讨论】:

  • 我面临同样的问题..从一台设备注销但无法从其他设备注销..感谢您的帮助..
  • 你应该调试正在发生的事情。我建议写下您正在测试的所有设备的会话 ID。你可以像这样\Session::getId() 得到它。然后检查您的 redis 以查看密钥 'user:sessions:' 是否存在这些会话 ID。 $userId'。
  • 我使用 dd() 看到的注销后没有 sessionId;
  • 登录时应该有,并且在您的设备上应该有所不同。因此,将这些 ID 与您在 redis 中针对该用户的数据进行比较。
猜你喜欢
  • 2015-09-01
  • 2016-09-24
  • 2019-04-30
  • 1970-01-01
  • 2017-11-18
  • 2017-05-17
  • 2019-11-13
  • 2012-05-11
  • 2016-11-04
相关资源
最近更新 更多