php - 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 不会为空?. 在这里,即使用户没有登录第一台设备,他也无法登录另一台设备。
我该如何解决这个问题?
解决方案
最好使用redis。记录登录的用户,并在登录时考虑超时,并且没有做任何事情将其排除在外。
推荐阅读
- javascript - 骨干 JS 点击事件处理程序不起作用
- meteor - 尝试使用 react-meteor-hooks 订阅集合,但加载总是正确的
- macports - 构建coreutils失败:命令执行失败(form macports返回)
- c++ - 使用外部模板构建时间优化
- javascript - AJAX中的chartjs成功函数
- javascript - 如何在没有后端的网站上预览本地视频文件?
- javascript - Redux 操作未触发 - 没有错误
- maven - Maven 测试在本地(OSX)运行良好,但在移除 CI 机器上根本没有运行
- jira - 如何在 Jira Service Desk 中添加报告创建状态?
- r - 是否有语法糖来在 R 中定义数据框