Laravel 5.2-如何从所有设备中注销用户 [英] Laravel 5.2 - How to logout a user from all of his devices

查看:76
本文介绍了Laravel 5.2-如何从所有设备中注销用户的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当用户从垂直设备注销时,我要从他到目前为止已登录的所有设备中注销.我如何在Laravel中做到这一点.

When a user logged out from a perticular device I want to logout from all the device he has logged in till now . How I do it in Laravel.

我通过安装"predis/predis":〜1.0",使用Redis将用户ID保留在Session中.

I have used Redis for keeping the userId in Session by installing "predis/predis": "~1.0"

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

And Here is my controller for SignIn and Logout:

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

它已成功登录并注销,但不会杀死其他设备上的所有会话.

It's successfully get logged in and also logged out but it doesn't kill all the session in other devices.

我该如何解决问题?

推荐答案

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

So issue was with typo in redis key name, for write data used $redis->sadd('users:sessions:'.$userId,Session::getId()); where key's prefix 'users:sessions:' and for get data used $redis->srem('user:sessions:' . $userId, $sessionId); where key's prefix 'user:sessions:' Thats why code didn't work and dd() returned empty array.

所以正确的代码看起来像这样

so correct code looks like this

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

这篇关于Laravel 5.2-如何从所有设备中注销用户的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆