场景很简单:我希望单个用户在给定时间只从一台设备登录 . 使用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 回答
在laravel中创建自己的会话驱动程序处理程序,并在处理程序的“destroy”和“gc”事件中执行所需的代码 .
您可以从Illuminate / Session / DatabaseSessionHandler.php中简单地复制默认的DatabaseSessionHandler代码,并将其命名为CustomeSessionHandler.php .
确保在AppServiceProvider中注册新的处理程序
在你的.env或你的config / session.php中使用新的驱动程序
SESSION_DRIVER =定制