一尘不染

Laravel 5.2-如何从所有设备中注销用户

redis

当用户从垂直设备注销时,我要从他迄今为止登录的所有设备中注销。我在Laravel中如何做。

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

这是我用于登录和注销的控制器:

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

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

我该如何解决这个问题?


阅读 252

收藏
2020-06-20

共1个答案

一尘不染

因此,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');
}
2020-06-20