簡體   English   中英

事件監聽器中的 Laravel auth::login 不持久

[英]Laravel auth::login in EventListener doesn't persist

我有一個 Laravel 5.2 應用程序,我正在嘗試在事件偵聽器中登錄用戶。 所有路由都包含在 Web 中間件中,我正在為會話使用數據庫,我看到它在事件偵聽器執行時創建了一個條目,但是稍后訪問其他頁面的行為就好像會話中沒有用戶一樣。

只是為了測試我的代碼,我在控制器路由中添加了相同的偵聽器代碼並且有效,它仍然存在。 我懷疑這與事件偵聽器無法使用 Web 中間件有關。 我試過在控制器中處理事件,同樣的行為。

我注意到 session 數據庫表中的 user_id 在從事件偵聽器登錄時設置為 null,但從控制器登錄時它具有正確的值。 我不確定這是為什么或如何更改它(在登錄前顯式設置user_id字段無效)

此外,登錄后立即在事件偵聽器中調用Auth::user()返回有效用戶! 它只是對應用程序的其余部分不可用。 我懷疑這是因為觸發事件的插件在一個單獨的迷你應用程序中,如路由所見。 將它包裝在同一個中間件中也沒有效果。

我該怎么做才能讓事件偵聽器登錄在整個應用程序中持續存在?

// EventListener, doesn't persist
public function handle(Saml2LoginEvent $event)
{
    $user = $event->getSaml2User();
    $laravelUser = User::where('mail', $user->getAttributes()['mail'][0])->where('active', 1)->first() ;
    Auth::guard('web')->login($laravelUser);
}

// UserController, persists !
public function home(Request $request){
    $laravelUser = User::where('mail', 'test@mail.com')->where('active', 1)->first() ;
    Auth::guard('web')->login($laravelUser);
}

事件偵聽器類必須是Web中間件的一部分,才能訪問會話持久性。 因此,將這些類添加到Web中間件組即可解決問題

Auth::login($user) 即使在嘗試了一切之后也對我不起作用。 (添加了 saml 中間件等)。

從監聽器中刪除所有 dump()、var_dump()、die() 等后,它對我有用!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM