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

时间:2015-06-16 18:52:35

标签: php session laravel laravel-5 logout

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

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

首先要记住的是检查中间件(每个请求)中的密码,这不是很好并且会显着降低性能。

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

AND 这样做的最佳方法是什么?大型网站如何从所有设备注销用户?

4 个答案:

答案 0 :(得分:2)

在最新版本的Laravel 5.6中

您可以通过

执行此操作
auth()->logoutOtherDevices();

logoutOtherDevices

More Info

答案 1 :(得分:1)

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

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

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

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

$redis->srem('user:sessions:' . $userId, $sessionId);

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

$redis->del('laravel:' . $sessionId);

获取用户的所有会话ID

$redis->smembers('user:sessions:' . $userId);

从所有设备注销使用循环

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

答案 2 :(得分:0)

From laravel documents:

  

Invalidating Sessions On Other Devices

     

Laravel提供了一种机制,用于使a失效并“注销”   在其他设备上处于活动状态且未失效的用户会话   他们当前设备上的会话。

     

首先,您应确保   Illuminate \ Session \ Middleware \ AuthenticateSession中间件为   在您的app/Http/Kernel.php课程的网络中显示且未评论   中间件组:

'web' => [
    // ...
    \Illuminate\Session\Middleware\AuthenticateSession::class,
    // ...
],
     

然后,您可以在Auth外观上使用logoutOtherDevices方法。   此方法要求用户提供其当前密码,   您的应用程序应通过输入表格接受:

use Illuminate\Support\Facades\Auth;

Auth::logoutOtherDevices($password);
     

调用logoutOtherDevices方法时,用户的另一个方法   会话将完全无效,这意味着它们将被“记录”   之前已通过身份验证的所有防护措施。

答案 3 :(得分:0)

使其他设备上的会话无效

df = pd.DataFrame([1,2,3,4], columns=['a'])
df["b"] = df.a.shift()