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

