首页 > 解决方案 > Laravel 允许每个用户一个会话

问题描述

我试图让每个用户只允许一个会话。因此,如果有人在他已经登录他的用户帐户时尝试登录,则不允许该用户登录。只有当第一个用户从他的帐户注销时,第二个用户才能登录。

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

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

我该如何解决这个问题?

标签: phplaravelsessionlaravel-5.6sentinel

解决方案


最好使用redis。记录登录的用户,并在登录时考虑超时,并且没有做任何事情将其排除在外。

laravel 中的 redis


推荐阅读