会话的laravel事件侦听器到期,因为会话到期时没有调用注销事件侦听器

时间:2018-06-19 14:37:22

标签: php laravel session events laravel-5.2

情况很简单:我希望在给定时间仅从一个设备登录一个用户。使用laravel框架5.2版


到目前为止,这是我使用事件侦听器实现此目标的工作:

我在用户表中设置了一个is_logged_in标志,当用户登录时该标志为ON。基于它的ON状态,它将拒绝来自同一用户的所有后续登录请求。

我使用登录尝试,登录和注销事件来实现此目的:

  1. 在登录尝试侦听器上,将执行以下代码。它将检查用户是否已经登录,然后在会话中设置一个已记录的标志。


       $user = User::select('is_logged_in')->where('email', $event->credentials['email'])->first();
        if($user->is_logged_in == 1){
            Session::put('logged', 'Yes');
        }else{
            Session::put('logged', 'No');
        }

  1. 现在在登录事件中,将检查已记录的会话标志,如果设置了该标志,则用户将被强制注销,并保持记住的令牌(注销时会更改)


    if(session('logged') == "Yes"){
        $previous_remember_token  = $event->user->remember_token;
        $previous_usesr_id = $event->user->id; 
        Auth::logout();
        $user = User::find($previous_usesr_id);
        $user->remember_token = $previous_remember_token;
        $user->save();
    }else{
        $event->user->is_logged_in = 1;
        $event->user->save();
    }

  1. 甚至在注销时,我甚至使用以下代码重置is_logged_in的用户数据库标志:


    if(session('logged') != "Yes"){ 
        $event->user->is_logged_in = 0;
        $event->user->save();
    }

现在这是我面临的问题:

  1. 会话过期时,甚至不执行注销,如何在会话过期时执行注销事件代码? laravel中是否存在任何session:expire事件侦听器? 1.1这也导致了另一个问题,laravel如何监视会话时间,以及如何节省会话时间? laravel框架如何以及何时使会话过期?
  2. 我也想在用户关闭选项卡或浏览器时执行注销代码,这确实很困难,但我认为可能是某些ajax函数在一定间隔后更新了用户表列并编写了cron作业来检查间隔并关闭DB中的标志,有没有更好的方法,请指导?

1 个答案:

答案 0 :(得分:0)

在laravel中创建自己的会话驱动程序处理程序,并在处理程序的“ destroy”和“ gc”事件中执行所需的代码。

您可以简单地从中复制默认的DatabaseSessionHandler代码 照亮/会话/数据库SessionHandler.php 并命名为CustomeSessionHandler.php。

确保在AppServiceProvider中注册新的处理程序

public function boot()
{
  Session::extend('custom', function ($app) {

      $connection = $app['config']['session.connection'];
      $table = $app['config']['session.table'];
      $lifetime = $app['config']['session.lifetime'];
      $connection = $app['db']->connection($connection);
      return new CustomSessionHandler($connection, $table, $lifetime, $app);
  });
}

以及您的.env或config / session.php中 使用新的驱动程序

SESSION_DRIVER =自定义