You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:24:45