【发布时间】:2019-10-19 15:15:26
【问题描述】:
我试图只允许每个用户进行一个会话。因此,如果有人在他已经登录他的用户帐户时尝试登录,则不允许该用户登录。只有当第一个用户从他的帐户注销时,第二个用户才能登录。
我正在使用哨兵进行身份验证。所以,我在登录方法中添加了以下代码。
$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 自动销毁或用户关闭浏览器,那么 logout 方法将不会被调用并且 session_id 不会为空?。这里即使用户没有在第一台设备上登录,他也无法在另一台设备上登录。
我该如何解决这个问题?
【问题讨论】:
标签: php laravel session laravel-5.6 sentinel