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

Laravel 11中API路由组绑定自定义AdminMiddleware不生效问题

Laravel 11 自定义管理员中间件不生效问题排查与解决

核心问题分析

你的代码存在两个关键问题导致中间件不生效,同时也是之前引发全局路由受影响的潜在原因:

  1. 管理员路由缺少认证依赖:AdminMiddleware依赖Auth::user()获取当前用户,但/admin路由组仅绑定了is_admin中间件,未加入auth:sanctum认证中间件,导致Auth::user()始终返回null,中间件直接返回403,但你可能误以为是中间件未绑定成功。
  2. 路由组括号位置错误(全局影响的诱因):如果之前误将middleware()方法加到了外层/v1路由组上,会导致所有/v1下的路由都受该中间件影响。

解决方案

1. 修复路由组的中间件绑定

给/admin路由组同时添加auth:sanctum和is_admin中间件,确保先完成用户认证,再校验管理员权限:

修改routes/api.php中的/admin路由组部分:

Route::prefix('/v1')->group(function () {
    // 管理员路由组:先认证,再校验权限
    Route::prefix('/admin')->group(function () {
        Route::prefix('/product')->group(function () {
            Route::get('/', [ProductController::class, "index"]);
            Route::post('/', [ProductController::class, "store"]);
            Route::get('/{id}', [ProductController::class, "show"]);
            Route::put('/{id}', [ProductController::class, "update"]);
            Route::delete('/{id}', [ProductController::class, "destroy"]);
        });
        Route::prefix('/user')->group(function () {
            Route::get('/', [UserController::class, "index"]);
            Route::get('/{id}', [UserController::class, "show"]);
            Route::post('/{id}', [UserController::class, "store"]);
            Route::put('/{id}', [UserController::class, "update"]);
            Route::delete('/{id}', [UserController::class, "destroy"]);
        });
    })->middleware(['auth:sanctum', 'is_admin']); // 同时添加两个中间件

    // 其他路由保持不变
    Route::prefix('/auth')->group(function () {
        Route::post('/signup', [UserController::class, "signup"]);
        Route::post('/signin', [UserController::class, "signin"]);
        Route::post('/signout', [UserController::class, "signout"]);
    });
    Route::prefix('/product')->group(function () {
        Route::post('/', [ProductController::class, "product"]);
    });
});

2. 确认中间件配置正确性

你的bootstrap/app.php中的中间件别名配置是正确的,无需修改:

->withMiddleware(function (Middleware $middleware) {
    $middleware->alias([
        "is_admin" => AdminMiddleware::class,
    ]);
})

注意:不要将中间件添加到$middleware->append()或prepend()中,否则会变成全局中间件,影响所有路由。

3. 优化中间件逻辑(可选)

将未登录的返回状态码从403改为401,符合HTTP语义(401表示未认证,403表示已认证但权限不足):

if (!$user) {
    return response()->json([
        'status' => 'unauthorized',
        'message' => 'You need to log in first.'
    ], 401); // 改为401
}

验证步骤

  1. 执行命令查看路由绑定的中间件:
php artisan route:list

确认所有/v1/admin开头的路由,其Middleware列包含auth:sanctum和is_admin。

  1. 测试流程:
  • 调用/v1/auth/signin获取Sanctum Token;
  • 请求管理员路由时,在请求头中携带Authorization: Bearer {token};
  • 分别用普通用户和管理员用户测试,验证权限校验是否生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:35:13