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

Laravel会话配置问题:控制器可访问会话但中间件无法读取

Laravel 11.x 会话中间件无法读取会话的解决建议

核心问题定位

控制器中dd(Session::has('user'))返回true但中间件读取不到,大概率是会话未完成持久化或中间件执行顺序错误导致的,以下是针对性解决步骤:


1. 调整中间件执行顺序(关键)

Laravel 11 移除了app/Http/Kernel.php,所有中间件配置移至bootstrap/app.php。自定义中间件必须在会话启动中间件之后注册,否则会话尚未初始化就被校验:

// bootstrap/app.php
return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        // Web路由组中,先注册会话启动中间件,再注册自定义中间件
        $middleware->web([
            \Illuminate\Session\Middleware\StartSession::class,
            \App\Http\Middleware\CheckUser::class,
        ]);

        // 若使用全局中间件,同样确保会话中间件在前
        // $middleware->append(\Illuminate\Session\Middleware\StartSession::class);
        // $middleware->append(\App\Http\Middleware\CheckUser::class);
    })
    ->create();

2. 确保会话完成持久化

控制器中的dd()会中断请求生命周期,Laravel 会话默认在响应发送时才写入存储,你看到的true只是内存中的临时会话,并未真正保存到文件。修改控制器代码,避免用dd触发会话写入:

// 控制器代码替换为:
Session::put('user', $User);
Session::put('role', $Role);
// 用重定向或响应触发会话持久化
return redirect()->route('dashboard');

3. 修复会话目录权限

File 驱动依赖storage/framework/sessions目录的读写权限,执行以下命令修复:

chmod -R 755 storage/
chown -R www-data:www-data storage/ # 适配服务器运行用户,如Nginx/Apache,可根据实际调整

4. 手动清除旧会话文件

缓存清除命令不会清理 File 驱动的会话文件,直接删除目录下的旧文件:

rm -rf storage/framework/sessions/*

5. 路由分组校验

如果你的路由不在web分组中(比如 API 路由),默认不会加载会话中间件。需手动为目标路由组添加会话中间件:

// routes/api.php
Route::middleware([\Illuminate\Session\Middleware\StartSession::class, \App\Http\Middleware\CheckUser::class])->group(function () {
    // 你的业务路由
});

内容的提问来源于stack exchange,提问作者Ahmad Tahir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:03:24