EventListener 中的 Laravel auth::login 不持久

问题描述 投票:0回答:3

我有一个 Laravel 5.2 应用程序,我正在尝试在事件监听器中登录用户。所有路由都包含在 Web 中间件中,我正在使用数据库进行会话,并且我看到它在事件侦听器执行时创建一个条目,但是稍后访问其他页面的行为就像会话中没有用户一样。

为了测试我的代码,我在控制器路由中添加了相同的侦听器代码,并且该代码有效,并且仍然存在。我怀疑这与事件侦听器无法使用 Web 中间件有关。我尝试在控制器中处理该事件,行为相同。

我注意到从事件侦听器登录时,会话数据库表中的 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', '[email protected]')->where('active', 1)->first() ;
    Auth::guard('web')->login($laravelUser);
}
php session laravel-5
3个回答
0
投票

事件监听器类需要成为 Web 中间件的一部分才能访问会话持久性。因此,将这些类添加到 Web 中间件组中就可以解决问题


0
投票

Auth::login($user) 即使在尝试了一切之后也对我不起作用。 (添加了 saml 中间件等)。

从监听器中删除所有 dump()、var_dump()、die() 等后,它对我有用!


0
投票

我对 saml2 有同样的问题,已解决

  1. 在 saml2.php 配置文件中,在

    routesMiddleware
    数组中设置 'web'

  2. 'saml2/*'
    添加到VerifyCsrfToken中间件中的 except 数组中

© www.soinside.com 2019 - 2024. All rights reserved.