在异常处理程序.php中访问身份验证


Accessing Auth in ExceptionsHandler.php

我正在尝试从App'Exceptions'Handler类(app/Exceptions/Handler.php)的渲染方法中访问Auth类,以确定用户当前是否使用Auth::check()方法登录。

这在 5.1 中工作正常,但我已经升级到 5.2 并且不再有效。

为了调试它,我一直在将Auth::user()打印到日志中(返回 NULL),然后将重定向()返回到另一个视图。

然后从重定向转到的视图/控制器,将相同的Auth::user()打印到日志中,该日志按预期工作并返回登录用户。

因此,从Exceptions'Handler类中访问Auth类或user()方法似乎没有问题,只是由于某种原因它返回NULL,而应用程序的其他部分返回User。

感谢您提供有关此的任何信息!

发生这种情况是因为中间件StartSession $middlewareGroups应用程序的路由中间件组)内部,因此您无权访问经过身份验证的用户,因为初始化会话的中间件在生命周期中比ExceptionHandler晚开始。

app'Kernel.php文件中,移动以下行:

 'Illuminate'Session'Middleware'StartSession::class,

$middlewareGroups到全局堆栈$middleware。这些中间件在每次向应用程序发出请求期间运行,因此在此之后,Auth::user()将起作用。


警告:使用此解决方案,您将无法使用cookie会话驱动程序。与file和其他人配合良好。


更新:

如果你仍然需要在全局堆栈$middleware中使用StartSession并且还需要cookie session driver,则必须按下一个顺序将三个中间件从$middlewareGroup移动到$middleware

'App'Http'Middleware'EncryptCookies::class,
'Illuminate'Cookie'Middleware'AddQueuedCookiesToResponse::class,
'Illuminate'Session'Middleware'StartSession::class

经过一些研究,404错误似乎是唯一的罪魁祸首。如果是 500 错误,Auth::user() 可以工作。所以,在我的路由.php文件中,我在底部添加了这个

Route::any('{page}', 'ErrorController@Error404')->where('page', '(.*)');

以捕获任何未处理的终结点。在该ErrorController@Error404方法中,我可以访问Auth类。因此,无论您App'Exceptions'Handler中有什么逻辑,您都可以在ErrorController@Error404方法中复制它。(或者更好的是:将其提取到可以在两个位置引用的其他实体。