LifeTime之后 - Session.php自动注销

时间:2017-09-28 09:35:44

标签: laravel session lifetime

当我使用按钮注销时,我更新了用户表中的属性(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');
}

2 个答案:

答案 0 :(得分:2)

我真的不明白你的问题但是我试着给你一些关于发生了什么的提示。

您必须了解的是,我认为,当终身时间过去后,客户可能不会再在您的网站上了很长时间,因此不会发生任何特殊情况。客户端不会执行任何操作,也不会对服务器执行任何操作。仅仅是因为在没有相关请求的情况下无法检测并且没有(简单)方式执行代码。

唯一发生的事情是,在使用该cookie的下一个请求(可能会或可能不会发生)时,laravel将检测到生命周期已经过去并将cookie视为无效(并将相关请求视为非loggued请求) )

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

你想做什么的方法是存储用户的最后一个动作(也就是说,他做一个请求时更新它),并认为最后一个动作超过X分钟前的所有用户都处于非活动状态。请注意,这是非常不可靠的,但这是一个非常好的估计。

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

答案 1 :(得分:0)

到底失败了什么?生命周期会话到期时,users - 表是否未更新?

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

我认为实现这一目标的唯一方法是将生命周期设置为非常高的分钟数(例如99999999 => 190 years)和"强迫"用户点击退出按钮。 但是,用户仍然可以关闭浏览器窗口并离开您的应用程序而无需注销。

相关问题