当前位置: 首页 > 面试题库 >

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

何修能
2023-03-14
问题内容

当用户从垂直设备注销时,我要从他迄今为止登录的所有设备中注销。我在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');
}

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

我该如何解决这个问题?


问题答案:

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


 类似资料:
  • 我在一个数据库表中有一个GCM注册用户列表及其相应的注册ID,我实际上想在用户从表中删除时注销该用户。我在Stackoverflow中发现了很多示例,但大多数示例都基于旧的GCMRegistarAPI,现在已经不推荐使用了。我正在使用GoogleCloudMessaging API,并通过以下方法注册用户: 我有一个管理员应用程序,它充当第三方应用程序服务器,因为它向所有用户推送通知。我想注销一个

  • 问题内容: 我创建了一个Login页面以及许多其他页面,其中包含用于检查会话的代码。如果用户没有会话,则所有页面将重新加载并重定向到注销页面。每三秒钟调用一次此脚本。 我编写的代码可以正常工作,但我想以另一种方式实现它。用户注销后,所有打开的选项卡都会重新加载/刷新,从而导致用户注销。那可能吗? sessioncheck.php : 此代码在每个页脚中: 问题答案: 当ajax有用时 在以下情况下

  • 我在web应用程序中使用AWS Cognito身份验证。用户可以使用三个身份提供者之一进行身份验证:cognito用户池(通过用户名和密码)、facebook和google。以下是我获取凭据的方式: 登录-对象,可以包含来自cognito、facebook和google的令牌。 如果用户单击注销按钮,web应用程序应该做什么?如果当前用户存在(当前用户仅存在于cognito用户名、密码验证中),我

  • 我制作了一个Android应用程序。我使用GCM推送通知。当用户登录时,我正在向GCM注册设备。我使用外部MySql数据库来存储用户的注册ID。它工作得很好。 但是 当我做了以下步骤: 在我的手机上安装了我的应用程序。 用用户1登录。 从我的手机卸载应用程序。 再次安装应用程序。 用用户2登录。 我的手机仍会收到user1通知,这意味着卸载应用程序时GCM没有注销我的设备。 我不能删除的应用程序卸

  • 如何从Firebase获取设备令牌(FCM注册令牌)? 我正在使用firebase制作移动应用程序,并使用Node.js制作其服务器。 当用户第一次运行应用程序并注册FCM服务器时,我是否应该将令牌保存到另一个数据库?

  • 问题内容: 我在iOS应用中使用Firebase身份验证。当用户使用Firebase登录我的应用程序然后注销该用户的所有其他设备(会话)时,Firebase中是否有任何方法?我可以使用Firebase admin SDK来做到这一点吗? 问题答案: 当我遇到此问题时,我已使用云功能解决了该问题,请访问此链接以获取更多详细信息https://firebase.google.com/docs/auth