在Exceptions\Handler.php中访问身份验证

在Exceptions\Handler.php中访问身份验证,php,laravel,laravel-5,Php,Laravel,Laravel 5,我试图从App\Exceptions\Handler类(App/Exceptions/Handler.php)的render方法中访问Auth类,以使用Auth::check()方法确定用户当前是否登录 这在5.1中运行良好,但我已升级到5.2,它不再工作 为了调试这个,我一直在将Auth::user()打印到日志中(返回NULL),然后将redirect()返回到另一个视图 然后从视图/控制器重定向到,将相同的Auth::user()打印到日志中,该日志按预期工作并返回登录的用户 因此,从Ex

我试图从
App\Exceptions\Handler
类(App/Exceptions/Handler.php)的render方法中访问
Auth
类,以使用
Auth::check()
方法确定用户当前是否登录

这在5.1中运行良好,但我已升级到5.2,它不再工作

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

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

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


谢谢你提供的任何信息

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

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

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

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

app\Kernel.php
文件中,移动此行:

 \Illuminate\Session\Middleware\StartSession::class,
$middlewareGroups
到全局堆栈
$middleware
。这些中间件在应用程序的每个请求期间运行,因此在此之后,
Auth::user()
将起作用


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


更新:

如果您仍然需要在全局堆栈内使用
StartSession
$middleware
,并且还需要
cookie会话驱动程序
,则必须按以下顺序将三个中间件从
$middlewareGroup
移动到
$middleware

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

在用户/会话通过身份验证之前是否引发异常?如果是这样,这将解释为什么您无法访问该值。