Laravel auth ::在EventListener中登录并不会持续存在

时间:2016-04-01 18:10:32

标签: php session laravel-5

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

为了测试我的代码,我在控制器路由中添加了相同的侦听器代码,并且它仍然有效。我怀疑这与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', 'test@mail.com')->where('active', 1)->first() ;
    Auth::guard('web')->login($laravelUser);
}

1 个答案:

答案 0 :(得分:0)

事件侦听器类必须是Web中间件的一部分,才能访问会话持久性。因此,将这些类添加到Web中间件组即可解决问题