【问题标题】:Laravel allow one session per userLaravel 允许每个用户一个会话
【发布时间】: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


【解决方案1】:

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

redis in laravel

【讨论】:

    猜你喜欢
    • 2015-03-12
    • 2012-06-02
    • 1970-01-01
    • 2014-10-11
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    相关资源
    最近更新 更多