Laravel 9错误视图中auth()->user()无法使用,如何加载认证用户?
Laravel 9.x 错误视图中获取认证用户的解决方案
问题根源
Laravel 默认的异常处理流程在渲染错误页面时,不会经过 web 中间件组(包含会话启动、认证会话等核心中间件),因此 auth()->user() 无法获取到当前登录用户。
解决方法
方法一:修改异常处理器,手动加载会话与认证中间件
在 app/Exceptions/Handler.php 中重写 render 方法,在渲染错误视图前手动触发会话和认证中间件:
<?php namespace App\Exceptions; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; use Throwable; use Illuminate\Session\Middleware\StartSession; use Illuminate\Auth\Middleware\AuthenticateSession; class Handler extends ExceptionHandler { // ... 保留原有默认代码 public function render($request, Throwable $e) { $response = parent::render($request, $e); // 仅对错误页面响应进行处理 if ($response->isSuccessful() || $response->isRedirection()) { return $response; } // 启动会话中间件 (new StartSession)->handle($request, function () {}); // 启动认证会话中间件,维持用户登录状态 (new AuthenticateSession)->handle($request, function () {}); // 重新渲染错误视图,此时已加载认证信息 return parent::render($request, $e); } }
方法二:直接在视图渲染时注入用户信息
若不想修改中间件逻辑,可在异常处理器中重写 renderView 方法,手动从会话提取用户并注入视图:
protected function renderView($view, $data) { // 从默认web guard的session中获取用户ID $userId = session('login_web_' . sha1(config('app.key'))); if ($userId) { $data['user'] = \App\Models\User::find($userId); } return parent::renderView($view, $data); }
注意:此方法依赖默认session键格式,若自定义了guard或session配置,需对应调整键名。
验证效果
修改完成后,触发错误页面(比如访问不存在的路由),基础模板中的 auth()->user() 或注入的 $user 变量即可正常获取登录用户,菜单逻辑能够正常执行。
内容的提问来源于stack exchange,提问作者elb98rm
相关产品推荐
相关产品推荐

