【问题标题】:Share Laravel Session on Subdomains with different guards与不同的守卫共享子域上的 Laravel 会话
【发布时间】:2018-02-14 22:10:55
【问题描述】:

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

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

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

我在子域和域上使用不同的保护,以 SubUser 和 User 类作为提供者。

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

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

【问题讨论】:

标签: php laravel authentication laravel-5.4


【解决方案1】:

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

我的设置是所有子域都有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 的新类,如下所示:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 已经这样做了。这导致 laravel 在 example.comsome.example.com 上加载相同的会话 id,但仍然没有保持登录状态
    • 清除所有内容。 cookie、会话表、浏览器数据、浏览器历史记录、应用程序缓存...
    猜你喜欢
    • 2020-01-15
    • 2011-02-19
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 2018-06-08
    • 1970-01-01
    相关资源
    最近更新 更多