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

标签 php laravel session redis laravel-5.2

当用户从特定设备注销时,我想从他到目前为止登录的所有设备注销。我如何在 Laravel 中做到这一点。

我已经使用 Redis 通过安装“predis/predis”将 userId 保存在 Session 中:“~1.0”

这是我的登录和注销 Controller :

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

它已成功登录并注销,但不会终止其他设备中的所有 session 。

我该如何解决这个问题?

最佳答案

所以问题出在 redis 键名中的拼写错误, 用于写入数据 $redis->sadd('users:sessions:'.$userId,Session::getId()); 其中键的前缀 'users:sessions:' 和获取使用的数据 $redis->srem('user:sessions:' . $userId, $sessionId); 其中键的前缀 'user:sessions:' 这就是为什么代码不起作用并且 dd() 返回空数组的原因。

所以正确的代码是这样的

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

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

相关文章:

java - 某些客户端未设置 Cookie

php - 通过多个 ajax 调用更新 session

asp.net - 在 Azure 网站上使用 Azure 缓存服务(预览版)时出现问题

php - 搜索结果不显示 PHP MySql

php - 如何在Excel中获取MySQL表实体

sql - 在laravel中链接2个数据集的最有效方法

laravel - Laravel上的Facade\Ignition\Exceptions\ViewException错误?

php - php计数器,警告: fopen(clickcount.txt): failed to open stream

javascript - angularjs 中未定义的 URL ID

php - 基于 AND 而非 OR 查询 Laravel 多对多关系