2017-09-06 104 views
2

我目前正在使用spatie /权限和用户的子类与约束权限登录到我的应用程序中的子域名。分享与不同的警卫子域上的Laravel会话

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

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

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

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

任何人都试过这个,并得到了解决方案吗?

+1

这可能会导致你在某处:https://laracasts.com/discuss/channels/general-discussion/multi-domain-session – Quezler

+0

在这里回复https://stackoverflow.com/questions/26463467/laravel-maintain-a -session-in-sub-domain-of-different-server – aaron0207

+0

@Quezler看起来与我的问题类似。会尝试。 thx – Oli

回答

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{} 

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

0

添加SESSION_DOMAIN.env文件,并将其设置为.example.com

+0

已经做到了。这导致laravel在'example.com'和'some.example.com'上加载相同的会话ID,但仍然不会保持已登录状态 – Oli

+0

您尝试清除所有会话吗? –

+0

清除了一切。 cookies,会话表,浏览器数据,浏览器历史记录,应用程序缓存... – Oli