情况很简单:我希望在给定时间仅从一个设备登录一个用户。使用laravel框架5.2版
到目前为止,这是我使用事件侦听器实现此目标的工作:
我在用户表中设置了一个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');
}
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();
}
if(session('logged') != "Yes"){
$event->user->is_logged_in = 0;
$event->user->save();
}
现在这是我面临的问题:
答案 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 =自定义