LifeTime 之后 - Session.php 自动注销

After LifeTime - Session.php Auto Logout

当我使用按钮注销时,我更新了用户 Table 中的一个属性 (isActive)。一切正常,除非生命周期结束。 为什么?

此数据的使用仅供参考。所以简单的开发远不止于此。

谢谢

Session.php

    /*
|--------------------------------------------------------------------------
| Session Lifetime
|--------------------------------------------------------------------------
|
| Here you may specify the number of minutes that you wish the session
| to be allowed to remain idle before it expires. If you want them
| to immediately expire on the browser closing, set that option.
|
*/

'lifetime' => 120,

'expire_on_close' => false,

AuthenticateUsers.php

    public function logout(Request $request)
{
    User::where('id', Auth::user()->id)->update(['isActive' => '0']);

    $this->guard()->logout();

    $request->session()->invalidate();

    return redirect('/login');
}

究竟是什么失败了? users-table 是否在 lifetime-session 到期时未更新?

那是因为这是通过设置会话 cookie 的生命周期自动发生的。当 cookie 过期时,这不会在您的应用程序中调用 logout 路由,也不会更新 users-table.

我认为实现这一点的唯一方法是将生命周期设置为非常高的分钟数(例如 99999999 => 190 years)和 "forcing" 用户点击注销按钮。 但是用户仍然可以关闭浏览器 window 并在不注销的情况下离开您的应用程序。

我不太明白你的问题,但我试着给你一些提示。

我认为您必须了解的是,当生命周期结束时,客户可能已经很长时间不在您的网站上了,所以不会发生什么特别的事情。不会对客户端执行任何操作,也不会对服务器执行任何操作。仅仅是因为没有相关请求就无法检测也没有(简单)执行代码的方法。

唯一会发生的事情是在下一次使用该 cookie 的请求时,这可能会发生也可能不会发生,laravel 将检测到生命周期已过并将该 cookie 视为无效(并考虑关联的作为非记录请求请求)

当用户特别要求断开连接时,将调用您的注销路由。当一个会话失效时它不会被神奇地调用,因为 laravel 在没有从该会话获得请求的情况下不会检测到会话失效。此外,一旦(并且如果)检测到无效,laravel 将不会调用注销路由,因为用户已经注销(会话无效,因此无法信任和使用数据)。

做你想做的事情的方法是存储用户的最后一个动作(也就是说,每次他发出请求时更新它)并将最后一个动作超过 X 分钟前的所有用户视为不活动。请注意,它非常不可靠,但这是一个相当不错的估计。

如果您真的想要某种可靠的方法,请看一下这个问题:Detect user exit site 但请注意,定期轮询用户会给您的服务器带来非常高的性能成本。