【问题标题】:Accessing Auth in Exceptions\Handler.php在 Exceptions\Handler.php 中访问 Auth
【发布时间】:2016-01-24 22:43:36
【问题描述】:

我正在尝试从 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,而应用程序的其他部分返回 User..

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

【问题讨论】:

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

标签: php laravel laravel-5


【解决方案1】:

发生这种情况是因为 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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 2018-04-02
      • 2020-06-29
      • 1970-01-01
      • 2017-06-15
      • 2020-10-03
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      相关资源
      最近更新 更多