Laravel 5 - 从他的所有设备上注销用户

Sky*_*Sky 5 php session logout laravel laravel-5

一个用户已登录。他也已经登录了 3 台不同的计算机。现在用户更改了他的密码。

我想做点什么让他从他的所有设备中退出。默认情况下,如果我们在一台设备上更改密码,其他设备上不会发生任何事情。

想到的第一件事是在中间件(每个请求)中检查密码,这并不好并且会显着降低性能。

我怎样才能在 Laravel 5 中做到这一点?

什么是做到这一点的最好方法是什么?大型网站如何从所有设备上注销用户?

DsR*_*Raj 8

在最新版本的 Laravel 5.6

你可以从

auth()->logoutOtherDevices();
Run Code Online (Sandbox Code Playgroud)

注销其他设备

更多信息


dya*_*nko 3

我做了类似的事情。首先,我将会话保存在 Redis 中。对于每次登录,我都会在成功验证后保存会话 ID,并将其与用户 ID(它是数组)相关联。如果用户更改密码,您可以删除除当前用户会话之外的所有用户会话(使用会话 ID)。如果用户注销,您可以从用户会话数组中删除会话 ID。(我认为你可以使用MySQL或其他存储来保存用户和会话ID之间的关系)

我使用保存会话ID(当用户登录时)

$redis = \LRedis::connection();
$redis->sadd('user:sessions:' . $userId, Session::getId());
Run Code Online (Sandbox Code Playgroud)

用于从用户会话数组中删除会话 ID(如果用户注销或手动注销)

$redis->srem('user:sessions:' . $userId, $sessionId);
Run Code Online (Sandbox Code Playgroud)

删除 Laravel 会话(从其他设备注销用户)

$redis->del('laravel:' . $sessionId);
Run Code Online (Sandbox Code Playgroud)

获取用户的所有会话 ID

$redis->smembers('user:sessions:' . $userId);
Run Code Online (Sandbox Code Playgroud)

要从所有设备注销,请使用循环

$userSessions = $redis->smembers('user:sessions:' . $userId);
$currentSession = Session::getId()
foreach ($userSessions as $sessionId) {
    if ($currentSession == $sessionId) {
        continue;  //if you want don't remove current session
    }

    $redis->del('laravel:' . $sessionId);
    $redis->srem('user:sessions:' . $userId, $sessionId);
}
Run Code Online (Sandbox Code Playgroud)