使用不同的警卫在子域上共享Laravel Session

时间:2017-09-06 12:10:06

标签: php laravel authentication laravel-5.4

我目前正在使用spatie / permissions和User的Subclass,并且对我的应用程序中的子域名的登录权限有限制。

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

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

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

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

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

2 个答案:

答案 0 :(得分: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{}

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

答案 1 :(得分:0)

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