Laravel 12.0.1中API控制器设置的Session值在中间件中无法获取的问题求助
我最近在Laravel 12.0.1里碰到了一个Session相关的棘手问题:我在API控制器的登录验证逻辑里明明设置了Session值,但在自定义中间件中读取时却总是返回null,更奇怪的是,中间件日志里显示的Session数据和我存在数据库里的完全不是同一个!
具体现象对比
我从数据库里查到的laravel_session对应的Session数据是包含user: "admin"的:
laravel_session=fca6d3xPRfTdlHBSTJWBd0KvaieSdKPbcGkFBZxa
a:3:{s:6:"_token";s:40:"0hYLgh1hHAZNW2Ar8E6MDBP5zKJXlLynSjt4dgTp";s:4:"user";s:5:"admin";s:6:"_flash";a:2:{s:3:"old";a:0:{}s:3:"new";a:0:{}}}
但在中间件里打印的Session日志却只有一个完全不同的_token,根本找不到user字段:
my session value: {"_token":"T9EtbOAiUwUYc9s1l1gC4TrdSkTj8nT9SDFbqTIA"}
我的相关代码片段
1. API控制器中的登录验证逻辑
登录成功后我用session()辅助函数设置了Session,而且这里能正常拿到$acct['name'],绝对不是null:
// loginVerify 方法 $validate = $request->authenticate(); if ($validate) { $post = $request->post()['body']; $acct = User::where([ ['email', '=', $post['acct']], ['password', '=', $post['ps']], ])->first(); session(['user' => $acct['name']]); return $acct; }
2. 自定义中间件 managePage 的处理逻辑
这里打印Session并判断user是否存在,不存在就跳转到登录页:
// middleware managePage public function handle(Request $request, Closure $next): Response { Log::debug ('my session value: ' . json_encode(session()->all())); dd($request->header('Cookie')); // 调试发现Cookie里的laravel_session和数据库里一致,但Session内容不对 if (empty(session('user'))) { return redirect('/managerLogin'); } return $next($request); }
3. 中间件配置
我给manageSetting组前置了StartSession中间件,managePage组则添加了自定义中间件:
$middleware->prependToGroup('manageSetting', [ \Illuminate\Session\Middleware\StartSession::class, ]); $middleware->appendToGroup('managePage', [ ManagerPage::class, ]);
4. 路由配置
Web路由和API路由都使用了manageSetting中间件组:
// Web 路由 Route::middleware(['manageSetting', 'managePage'])->group(function () { Route::get('/homeManage', function () { return Inertia::render('manage/homeManage'); }); Route::get('/groupManage', function () { return Inertia::render('manage/groupManage'); }); }); Route::middleware(['manageSetting'])->group(function() { Route::get('/managerLogin', function () { return Inertia::render('manage/login'); })->name('managerlogin'); }); // API 路由 Route::middleware(['manageSetting'])->group(function () { Route::post('/updateGroup', [GroupController::class, 'update']); Route::post('/updateHome', [KeyVisualController::class, 'update']); Route::post('/loginVerify', [UserController::class, 'login']); });
我已经尝试过的解决方法
- 调用了Session的
reflash()、keep()方法 - 试过
$request->session()->save()强制保存Session - 反复确认登录逻辑里
$acct['name']不为空,且在登录函数内部能正常读取session('user')
核心疑问
为什么Cookie里的laravel_session和数据库里的对应上了,但中间件却读取到了另一个Session?怎么才能让中间件正确获取到我在API控制器里设置的Session值?
内容来源于stack exchange

