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

Laravel 12.0.1中API控制器设置的Session值在中间件中无法获取的问题求助

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 11:59:30