Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Larvel每个用户一个会话_Php_Laravel_Session_Laravel 5.1 - Fatal编程技术网

Php Larvel每个用户一个会话

Php Larvel每个用户一个会话,php,laravel,session,laravel-5.1,Php,Laravel,Session,Laravel 5.1,我正在尝试找出如何只允许每个用户使用一个会话。 因此,如果有人试图在已登录其用户帐户的情况下登录,则第一个会话将被销毁,并将被注销以仅允许当前会话 我正在关注这个:。但我不知道我应该把这些代码放在哪里: /** * Swap a user session with a current one * * @param \App\User $user * @return boolean */ protected function swapUserSession($user) { i

我正在尝试找出如何只允许每个用户使用一个会话。 因此,如果有人试图在已登录其用户帐户的情况下登录,则第一个会话将被销毁,并将被注销以仅允许当前会话

我正在关注这个:。但我不知道我应该把这些代码放在哪里:

/**
 * 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上。如果您使用的是最新的Laravel 5.3.15或更高版本,我建议您查看我发布的关于我遇到的这个问题的以下链接。我花了一些时间才弄明白,但我确实弄明白了,而且解决方法非常简单

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

启动并运行会话表-

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

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

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

在控制台的项目目录中,执行以下操作:

php artisan session:table

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


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


尽管如此,即使在纯php中,您也必须存储用户的登录状态和登录位置。不幸的是,我不知道laravel有这种开箱即用的功能。
/**
 * 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());
}