我有一个 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);
}
事件监听器类需要成为 Web 中间件的一部分才能访问会话持久性。因此,将这些类添加到 Web 中间件组中就可以解决问题
Auth::login($user) 即使在尝试了一切之后也对我不起作用。 (添加了 saml 中间件等)。
从监听器中删除所有 dump()、var_dump()、die() 等后,它对我有用!
我对 saml2 有同样的问题,已解决
在 saml2.php 配置文件中,在
routesMiddleware
数组中设置 'web'
将
'saml2/*'
添加到VerifyCsrfToken中间件中的 except 数组中