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

疑问:Laravel Sanctum的auth:sanctum中间件为何未拦截web认证请求?

问题分析与解决方案

核心结论:这是预期行为

你的API路由组启用了EnsureFrontendRequestsAreStateful中间件,该中间件会让Laravel Sanctum信任同域来源的会话认证(即web guard的认证)。所以当你用actingAs($user, 'web')发起请求时,Sanctum会判定这是合法的前端请求,允许通过认证,不会返回401。

调整方案

如果希望API端点完全拒绝web guard的会话认证,仅接受Sanctum令牌认证,可按以下方式修改:

1. 修改API中间件组

移除EnsureFrontendRequestsAreStateful::class,切断API对会话认证的信任:

// app/Http/Kernel.php
protected $middlewareGroups = [
    'api' => [
        // 移除该行:\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
        'throttle:api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
];

2. 修正测试用例

  • 若保留原中间件,测试未认证场景应直接发起无认证请求:
public function test_should_return_401_when_unauthenticated()
{
    $response = $this->postJson(route('posts.store'), []);
    $response->assertStatus(401);
}
  • 若已移除上述中间件,原测试用例会正常返回401,验证web guard被拒绝的场景。

补充说明

EnsureFrontendRequestsAreStateful的设计初衷是支持SPA类同域前端通过会话Cookie认证访问API,无需每次请求携带令牌。若不需要该特性,移除该中间件即可彻底隔离API与Web的认证体系。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:56:14