与不同的守卫分享子域上的 Laravel 会话

Share Laravel Session on Subdomains with different guards

我目前正在使用 spatie/permissions 和一个用户子类,该子类对登录到我的应用程序中的子域的权限有限制。

我现在希望能够在我的主域 example.com 和域 some.example.com 之间共享会话,其中 some 是从数据库动态加载的。

当我在 example.com 中登录的用户访问 abc.example.com 域并能够在那里登录时,我想使用当前会话。

我在子域和域上使用不同的守卫,子用户和用户 类 作为提供者。

我已经使用了数据库会话驱动程序,并且可以在日志中看到从数据库加载了相同的会话 ID。 由于应用程序正在从数据库加载相同的会话,我想知道为什么我的用户尚未登录。

有人试过这个并找到解决方案吗?

SESSION_DOMAIN 添加到您的 .env 文件并将其设置为 .example.com

所以我设法解决了这个问题。

我的设置是所有子域都有 user 保护,主域有 admin 保护。

我意识到 Auth::getName() 包含警卫名称,并且当我使用不同的警卫登录时,我最终在一个会话中有两个活动登录。但是这些登录名有不同的名称,并且只对右后卫有效。这个守卫在主域和子域中是不同的导致域和子域之间没有真正共享登录状态。

我通过覆盖默认 laravel SessionGuard 并像这样添加我自己的驱动程序来解决这个问题:

config/auth.php中:

'guards' => [
    'user' => [
        'driver' => 'extended_session',
        'provider' => 'users',
    ],

    'admin' => [
        'driver' => 'extended_session',
        'provider' => 'admins',
    ],
]

AppServiceProvider.php

\Auth::extend('extended_session', function ($app, $name, $config) {
    $providerConfig = $this->app['config']['auth.providers.'.$config['provider']];
    // If you don't use eloquent you need to alter the next line accordingly
    $provider = new EloquentUserProvider($app['hash'], $providerConfig['model']);
    return new SessionGuardExtended('extended_session', $provider, $this->app['session.store']);
});

并添加一个名为 SessionGuardExtended 的新 Class,如下所示:

use Illuminate\Auth\SessionGuard;
class SessionGuardExtended extends SessionGuard{}

这会导致域和子域具有相同的身份验证名称的共享会话。