Laravel每位用户允许一个会话

时间:2019-06-04 05:48:21

标签: php laravel session laravel-5.6 sentinel

我正在尝试每个用户只允许一个会话。因此,如果某人在已经登录用户帐户后尝试登录,则不允许该用户登录。第二个用户只能在第一个用户从其帐户注销时登录。

我正在使用哨兵进行身份验证。因此,我在登录方法中添加了以下代码。

$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不会为空?。即使用户没有在第一台设备上登录,也无法在另一台设备上登录。

我该如何解决?

1 个答案:

答案 0 :(得分:0)

最好使用Redis。记录已登录并有超时的用户,以供其考虑登录时未做任何事情以使其退出的时间。

redis in laravel