2017-09-06 100 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