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
相关产品推荐
相关产品推荐

