繁体   English   中英

Laravel每个用户一个会话

[英]Laravel one session per user

我试图弄清楚如何只允许每个用户一个会话。 因此,如果有人在他已登录其用户帐户时尝试登录,则第一个会话将被销毁并将被注销以仅允许当前会话。

我正在关注此事: 如何在Laravel中保持每个用户的单个会话 但我不知道应该把这些代码放在哪里:

/**
 * Swap a user session with a current one
 * 
 * @param \App\User $user
 * @return boolean
 */
protected function swapUserSession($user)
{
    if (!($user instanceof \App\User)) {
        return false;
    }

    $new_session_id = Session::getId(); //get new session_id after user sign in
    $last_session = Session::getHandler()->read($user->last_session_id); // retrive last session

    if ($last_session) {
        Session::getHandler()->destroy($user->last_session_id);
    }

    $user->last_session_id = $new_session_id;
    $user->save();

    return true;
}

我目前正在使用Laravel 5.1,所以我能为Auth找到的唯一一个控制器是AuthController.php,但它说要把它放在LoginController.php上

如果您正在使用文件驱动程序,则可以将以下方法添加到App \\ Http \\ Controllers \\ Auth \\ AuthController.php(在Laravel 5.2中测试)

/**
 * Only allow one concurrent session per user
 *
 * @param  Request  $request
 * @param  User  $user
 * @return Response
 */
protected function authenticated(Request $request, User $user)
{
    Session::put('user_id', $user->id);

    $files = array_diff(scandir(storage_path('framework/sessions')), array('.', '..', '.gitignore'));

    foreach ($files as $file) {
        $filepath = storage_path('framework/sessions/' . $file);
        $session = unserialize(file_get_contents($filepath));

        if ($session['user_id'] === $user->id && $session['_token'] !== Session::get('_token')) {
            unlink($filepath);
        }
    }

    return redirect()->intended($this->redirectPath());
}

如果您正在使用5.3.15或更高版本的最新版本,我建议您查看我发布的有关此问题的以下链接。 花了我一些时间来弄清楚,但我做了,修复非常简单。

首先(假设您已经干净地安装了laravel 5.3):

获取会话表并运行 -

转到存储在config / session.php中的会话配置文件,然后向下滚动到驱动程序配置。

默认情况下,它应设置为“文件”。

将此设置更改为“数据库”。 (如果要在数据库中存储会话)

在控制台的项目目录中,执行:

php artisan session:table

php artisan migrate

然后在以下链接中向下滚动到最后一条评论,并按照步骤修复会话问题。

https://github.com/laravel/framework/issues/15821

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM