gpt4 book ai didi

php - 从另一个浏览器注销一个浏览器 session - LARAVEL 5.2

转载 作者:可可西里 更新时间:2023-11-01 11:34:14 24 4
gpt4 key购买 nike

我在我的网站上跟踪用户的登录历史记录,为此我需要显示是否有任何其他 session 在另一个浏览器或设备中打开。另外,我需要提供一种功能,用户可以在其中注销在与当前 session 不同的浏览器/设备中打开的 session 。我正在使用 redis-server。到目前为止,我所做的事情如下。

.env 文件中,我已将 CACHE_DRIVERSESSION_DRIVER 更新为 redis

session.phpcache.php 中,我已将 driver 设置为 redis.

接下来,在登录时,我连接到 redis 服务器并存储特定用户的 session ID。

 $redis = Redis::connection();
$redis->sadd('user:sessions:'. Auth::user()->id, $session_id);

完成后,我可以使用 redis-cli 命令查看每个用户的多个 session ID。

> SMEMBERS user:sessions:1
> "95008658737a7f937c614bccbb748443a649c515"
> "f1f14db9b1760254a4072fe9b440f9acbacc8974"
> GET laravel:95008658737a7f937c614bccbb748443a649c515
> "s:332:\"a:5:{s:6:\"_token\";s:40:\"HAuA200irzF63fgFw4vCVkrsZNuqTk6o2XLkHzlu\";s:9:\"_previous\";a:1:{s:3:\"url\";s:33:\"http://localhost:8000/security\";}s:5:\"flash\";a:2:{s:3:\"old\";a:0:{}s:3:\"new\";a:0:{}}s:50:\"login_web_59ba36addc2b2f9401580f014c7f58ea4e30989d\";i:1;s:9:\"_sf2_meta\";a:3:{s:1:\"u\";i:1464957596;s:1:\"c\";i:1464957416;s:1:\"l\";s:1:\"0\";}}\";"

此输出让我假设用于在 laravel 中存储 session 的 redis 选项工作正常。

接下来,为了从特定 session 中注销用户,我使用了以下指令集:

public function logoutSession($session_id) {
$redis = Redis::connection();
$redis->del('laravel:' . $session_id);
$redis->srem('user:sessions:' . Auth::user()->id, $session_id);
}

调用该函数后,对应的session id删除成功。

redis-cli 中再次运行 SMEMBERSGET 命令证明了这一点。

所以情况是,我尝试从另一个浏览器(例如 Chrome)中删除在 Firefox 中打开的 session 。点击注销链接(对于来自 ChromeFirefox session /strong> session )从 redis-server 成功删除 Firefox session ,但是如果我尝试刷新 Firefox 浏览器,我仍处于登录状态。

Just an image displaying the functionality I am trying to achieve

我不明白我哪里出错了。我们将不胜感激任何形式的帮助。

谢谢

注意:我已经在使用'auth' 中间件,所以这不是问题所在。另外,如果我尝试调试代码,我会在 $_COOKIE 变量和 http 请求 变量中看到不同的 session_ids。这是正常的吗?

最佳答案

我自己也遇到过类似的问题。我对缓存失效等问题感到很沮丧……然后在再次完成“登录”过程后,我忘记检查“记住我”cookie。

https://laravel.com/docs/master/authentication#remembering-users

原来我已经成功清除缓存,但需要调用:

Auth::logout();

为了从数据库中删除“remember_token”。否则,Laravel 会将此视为重启 Auth 系统、重新登录用户并设置新 session cookie 的有效方法。

使用您的代码:

public function logoutSession($session_id) {
$redis = Redis::connection();
$redis->del('laravel:' . $session_id);
$redis->srem('user:sessions:' . Auth::user()->id, $session_id);
Auth::logout();
}

但这会从所有 session 中注销,包括您正在使用的 session 。

对于您的问题,我建议使用 Auth::viaRemember() 方法来确定创建请求以及 cookie 的客户端是否是您当前正在使用的客户端。它区分您当前的 session cookie 和“记住我”cookie:

if (Auth::viaRemember())
{
// Check Redis for session info
// Do something if not found, otherwise just proceed
}

**EDIT**:我在发布我的答案后发现了这个:Laravel Auth::logout not removing remember me cookie

总结一下:

if (Auth::viaRemember())
{
if (!Redis::get($key))
{
// Get remember_me cookie name
$rememberMeCookie = Auth::getRecallerName();

// Tell Laravel to forget this cookie
$cookie = Cookie::forget($rememberMeCookie);

return Redirect::to('/')->withCookie($cookie);
}
}

关于php - 从另一个浏览器注销一个浏览器 session - LARAVEL 5.2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37615661/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com