首页 文章

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

提问于
浏览
0

场景很简单:我希望单个用户在给定时间只从一台设备登录 . 使用laravel框架版本5.2


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

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

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

登录尝试侦听器

  • 执行以下代码 . 它将检查用户是否已登录,然后在会话中设置记录的标志 .
$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');
        }
  • 现在在登录事件中,检查记录的会话标志,如果其设置然后用户强制注销,则保持remember_token(在注销时更改)
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();
    }
  • 并在注销时甚至使用以下代码重置is_logged_in的用户数据库标志:
if(session('logged') != "Yes"){ 
        $event->user->is_logged_in = 0;
        $event->user->save();
    }

现在这里是我面临的问题:

  • 当会话到期时,甚至没有执行注销,如何在会话到期时执行我的注销事件代码?是否有会话:laravel中存在的expire事件监听器? 1.1这也引出了另一个问题:laravel如何监控会话时间以及保存它的位置? laravel框架如何以及何时使会话过期?

  • 我也想在用户关闭标签或浏览器时执行注销代码,这真的很难,但我认为可能是某些ajax函数在一定间隔后更新users表列并写一个cron作业来检查间隔和切换关闭DB中的标志,有没有更好的方法来做到这一点,请指导?

1 回答

  • 0

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

    您可以从Illuminate / Session / DatabaseSessionHandler.php中简单地复制默认的DatabaseSessionHandler代码,并将其命名为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 =定制

相关问题