php - Laravel 5 - 如何使用 Redis 从他的所有设备注销用户

标签 php laravel laravel-5 redis

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

我个人使用过Redis Server。在运行程序时,我还运行了 redis-server.exe。而且我在 Windows 中。 我还使用 CACHE_DRIVER=redis SESSION_DRIVER=redis 更改了 .env 文件 除了已经安装了 laravel 的 Redis 我还安装了 "predis/predis": "~1.0"

这是我的 Controller ,我在其中编写了用于强制用户从其他设备注销的登录信息。

在登录 Controller 中,当我 dd() $redis 时,我看到为该用户创建的 session ,但是当我登录和注销时,我 dd() $userSessions 但是看到空的,这意味着 session 表中没有存储任何内容来进行比较。

如果有人找到任何解决方案,请帮助我找到它。提前致谢。

Controller :

  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');
}

最佳答案

在 Laravel 中使用 Redis 你可以这样使用:

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

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

标签允许您删除存储在具体标签中的所有 key 。

[更新]

您必须适合 session 变量名称。

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');
}

关于php - Laravel 5 - 如何使用 Redis 从他的所有设备注销用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37460624/

相关文章:

php - 在 laravel 5 中添加背景图片

laravel - 如何允许 Laravel 数字验证为空值

javascript - 使用 JavaScript 的 Directions Google Map API

php - Twilio PHP API 库 : Warning: file_get_contents(): SSL operation failed with code 1

Laravel 验证多个字符串选项

php - undefined offset : 3 Laravel

php - 如何在 Controller 构造函数中添加两个中间件

php - 如何从 PHP 使用 RabbitMQ 延迟消息队列?

php - Mysqli 准备好的语句在 SQL 中工作但不在我的应用程序中

javascript - Laravel - 加载 Javascript 后生成 PDF