用户已登录。他还已登录3台不同的计算机。 现在用户更改了密码。
我想做点什么让他从他的所有设备中退出。默认情况下,如果我们在一台设备上更改密码,则其他设备上没有任何操作。
首先要记住的是检查中间件(每个请求)中的密码,这不是很好并且会显着降低性能。
我怎样才能在Laravel 5中做到这一点?
AND 这样做的最佳方法是什么?大型网站如何从所有设备注销用户?
答案 0 :(得分:2)
答案 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)
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()