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

Laravel Sanctum中间件权限校验失效:接口可被无权限访问

问题描述

我使用Laravel Sanctum 9.x开发API应用,令牌生成功能正常。但通过auth:sanctum中间件限制接口仅授权用户访问时,权限校验未生效——所有用户都能访问受保护接口。不过在控制器中调试auth('sanctum')->check()时,有效令牌返回true,无效令牌返回false。

我的routes/api.php代码如下:

Route::post('login', [AuthController::class, 'login']);
Route::group(['middleware' => ['auth:sanctum']], function () {
    Route::post('logout', [AuthController::class, 'logout']);
    Route::group([
        'prefix' => 'services/{service}',
        'where'  => [
            'service' => implode('|', array_column(ServiceEnum::cases(), 'name'))
        ]],
        function () {
            Route::get('accounts/{account}/balance', [AccountController::class, 'getBalance']);
        });
});
排查与解决方案
  • 检查中间件应用优先级
    确认app/Http/Kernel.php中$middlewareGroups['api']的配置,避免中间件顺序问题导致auth:sanctum校验逻辑未触发。必要时可在路由组中显式指定中间件顺序。

  • 验证令牌传递方式
    Sanctum默认支持三种令牌传递方式:

    • Authorization: Bearer {token} 请求头(推荐)
    • X-XSRF-TOKEN 请求头(配合Cookie)
    • 表单字段token
      确保前端请求的令牌传递格式符合要求,若使用自定义传递方式,需在config/sanctum.php中调整相关配置。
  • 排查路由嵌套问题
    尝试将auth:sanctum中间件直接添加到内层路由组,验证是否因嵌套导致中间件未继承:

    Route::group([
        'prefix' => 'services/{service}',
        'where'  => [
            'service' => implode('|', array_column(ServiceEnum::cases(), 'name'))
        ],
        'middleware' => ['auth:sanctum']
    ], function () {
        Route::get('accounts/{account}/balance', [AccountController::class, 'getBalance']);
    });
    
  • 确认Sanctum配置完整性
    检查config/sanctum.php中的stateful配置,确保包含你的前端域名(SPA场景);同时确认app/Providers/RouteServiceProvider.php中API路由已正确绑定api中间件组。

  • 清除路由缓存
    执行命令php artisan route:clear清除路由缓存,确保最新的中间件配置生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 00:15:44