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

