Laravel 5.3:数据库会话未按预期工作

3

我刚刚将Laravel的默认迁移添加到使用数据库会话中。在此之前,我使用的是文件系统。我这样做:php artisan session:table,然后我添加了所有我已经在文件会话中使用的列。之后,我更改了config/session.php的默认值为'driver' => env('SESSION_DRIVER', 'database'),然后我更改了.env文件。

BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=database
QUEUE_DRIVER=sync

看起来我的情况应该没问题,我运行了这个命令:artisan admin:clear。这个命令的作用是:

public function handle()
{
    Artisan::call('clear-compiled');
    Artisan::call('cache:clear');
    Artisan::call('config:clear');
    Artisan::call('view:clear');
    Artisan::call('route:clear');
}

然后我运行了这个命令:composer dumpautoload,然后再运行php artisan migrate

也许这些命令并不是必需的,但当我更改配置时,我总是喜欢进行清理。

真正的问题
现在,我仍然得到会话文件,并且我也有存储在数据库中的会话,但只有php artisan session:table命令中默认的6个列填充。所有其他列都保持为null

目标
我想使用数据库,因为经过一些阅读,这是能够在用户Auth()时更改数据的方法。我使用会话来制作视图。例如:

@if( Session::get('intellitaux_simple') == 1 )
    <li class="@if ($coreData['navChild'] == 'simple') active @endif">
         <a href="{{ url('/intellitaux/simple') }}">INTELLITAUX SIMPLIFIÉ</a>
    </li>
@endif

会话数据是在用户使用 LogSuccesfulLogin.php 事件登录时添加的。

有时我需要为已经登录的用户提供新链接的访问权限,但我不想强制他们注销然后重新登录。如果用户会话处于活动状态,我希望直接应用更改。因此,如果您能帮助我找出为什么我的数据库会话不起作用,我将不胜感激。

如果您认为有更好的方法来达到我的目标,请建议,我将不胜感激!

1个回答

4

你为什么写成 but only the default column from the php artisan session:table command are filled 呢?session:table 命令会创建一个有6个字段的迁移,而不仅仅是一个字段:

    Schema::create('sessions', function (Blueprint $table) {
        $table->string('id')->unique();
        $table->integer('user_id')->nullable();
        $table->string('ip_address', 45)->nullable();
        $table->text('user_agent')->nullable();
        $table->text('payload');
        $table->integer('last_activity');
    });

在执行 php artisan session:table 之后,您没有提到需要执行 php artisan migrate 命令。您是否已经迁移了这个包含6列的表?

这个表格是在以下文件中填充的:vendor/laravel/framework/src/Illuminate/Session/DatabaseSessionHandler.php

    $payload = ['payload' => base64_encode($data), 'last_activity' => time()];

    if (! $container = $this->container) {
        return $payload;
    }
    if ($container->bound(Guard::class)) {
        $payload['user_id'] = $container->make(Guard::class)->id();
    }

    if ($container->bound('request')) {
        $payload['ip_address'] = $container->make('request')->ip();

        $payload['user_agent'] = substr(
            (string) $container->make('request')->header('User-Agent'), 0, $
        );
    }

1
Session::set('key', value) 只会改变 payload 字段。 - shukshin.ivan
好的,所以为每个键添加所有列是没有用的。谢谢!在这种情况下,我有两个与该帖子相关的问题。1.为什么我的 storage/framework/sessions 文件夹中还有会话文件?2.在 sessions 表中,我得到了多个用户 ID 的会话行。有没有办法找出已验证用户使用的特定行? - Elie Morin
1
  1. 这些文件是新的吗?它们可能只是旧文件。垃圾收集器无法删除它们,因为它清理数据库并不知道它们的存在。
  2. 每个创建的会话都是一行记录。如果用户在另一个浏览器中打开网站,则会获得新的会话。查看“last_activity”字段以查找最后活动的会话。但请记住,用户可以在一组计算机上拥有许多活动浏览器。
- shukshin.ivan
1
我认为这是一个不错的方法。类似于 foreach{ base64_decode(payload) -> set -> base64_encode -> save } - shukshin.ivan
1
这是我找到的代码:$payload = unserialize(base64_decode($session->payload)); 然后,我可以使用 $payload['key'] = $value; 更改想要的内容。之后运行 $session->payload = base64_encode(serialize($payload)); $session->save(); 即可完美地工作! - Elie Morin
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接