我正在尝试每个用户只允许一个会话。因此,如果某人在已经登录用户帐户后尝试登录,则不允许该用户登录。第二个用户只能在第一个用户从其帐户注销时登录。
我正在使用哨兵进行身份验证。因此,我在登录方法中添加了以下代码。
$user = \App\Models\User::where('email', $request->input('email'))->first();
if (!empty($user) && isset($user->session_id) && !empty($user->session_id))
{
return redirect()->back()->withErrors('First logout in other device')->withInput();
}
然后我在用户表中添加了session_id。用户登录时,它将在数据库中存储该用户的session_id。
$session_id = \Session::getId();
Sentinel::update($user, ['session_id' => $session_id]);
我在注销功能中添加了以下代码
Sentinel::update($user, ['session_id' => '']);
\Session::flush();
它的工作流程是第一个用户登录一个设备。同时尝试用其他设备登录,他将无法登录第二个设备。现在,如果他从第一台设备注销,session_id将为空。因此,现在他将能够登录第一个设备。
现在的问题是,如果会话自动销毁或用户关闭浏览器,那么退出方法将不会被调用,session_id不会为空?。即使用户没有在第一台设备上登录,也无法在另一台设备上登录。
我该如何解决?