Laravel提供五种中间件鉴权方法:一、内置auth中间件实现基础登录验证;二、自定义CheckRole中间件按角色控制访问;三、Gate与Policy声明式授权;四、Sanctum JWT Token无状态API鉴权;五、MultiGuardAuth多守卫混合鉴权。

如果您在 Laravel 应用中需要控制用户对特定路由的访问权限,则需通过中间件实现鉴权逻辑。以下是多种可直接落地的中间件鉴权实现方法:
一、使用内置 Auth 中间件
Laravel 自带 auth 中间件用于验证用户是否已登录,适用于基础会话认证场景。该中间件自动调用 Guard 实例检查当前请求是否携带有效认证凭据。
1、确保 app/Http/Kernel.php 的 $middlewareGroups['web'] 中已注册 \App\Http\Middleware\Authenticate::class(默认已存在)。
2、在路由定义中添加 middleware('auth'),例如:Route::get('/dashboard', [DashboardController::class, 'index'])->middleware('auth');
3、未认证用户将被重定向至 login 路由(由 RedirectIfAuthenticated 中间件控制)。
二、自定义角色权限中间件
通过创建独立中间件判断用户角色或权限字段,实现细粒度访问控制。该方式不依赖第三方包,直接读取用户模型上的 role 或 permissions 字段。
1、执行 php artisan make:middleware CheckRole 生成中间件类。
2、在 app/Http/Middleware/CheckRole.php 的 handle 方法中编写逻辑:
if (Auth::check() && Auth::user()->role === 'admin') { return $next($request); } else { abort(403); }
3、在 Kernel.php 的 $routeMiddleware 数组中注册:'role.admin' => \App\Http\Middleware\CheckRole::class;
4、在路由中调用:Route::get('/admin/users', [UserController::class, 'index'])->middleware('role.admin');
三、基于 Gate 和 Policy 的声明式鉴权
Gate 提供闭包式权限定义,Policy 将授权逻辑与模型解耦,适合复杂业务规则。两者均通过 authorize 方法触发,底层统一由 Illuminate\Auth\Access\Gate 管理。
1、在 AuthServiceProvider 的 boot 方法中定义 Gate:
Gate::define('delete-post', function ($user, $post) { return $user->id === $post->user_id; });
2、在控制器方法顶部调用 $this->authorize('delete-post', $post); 或在 Blade 模板中使用 @can('delete-post', $post) 判断。
3、若需 Policy,运行 php artisan make:policy PostPolicy --model=Post,然后在 Policy 类中实现 delete 方法并返回布尔值。
4、注册 Policy:Gate::policy(Post::class, PostPolicy::class);
四、JWT Token 中间件鉴权(API 场景)
针对无状态 API 接口,使用 tymon/jwt-auth 或 laravel/sanctum 提供的 Token 验证机制。本方案以 Sanctum 为例,其通过 tokenable_type/tokenable_id 关联用户,避免 Session 依赖。
1、安装 laravel/sanctum 并发布配置:php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
2、运行 php artisan sanctum:install 创建数据库迁移并执行 migrate。
3、在 api 路由中添加 middleware('auth:sanctum'),例如:Route::get('/api/user', function (Request $request) { return $request->user(); })->middleware('auth:sanctum');
4、前端请求头必须携带 Authorization: Bearer your_valid_api_token 才能通过校验。
五、多守卫混合鉴权中间件
当应用同时支持 Web 登录与 API Token 访问时,可构建组合中间件,依次尝试多个 Guard(如 web、sanctum),任一成功即放行,提升路由复用性。
1、创建中间件 php artisan make:middleware MultiGuardAuth
2、在 handle 方法中按顺序调用 Auth::guard('web')->check() 和 Auth::guard('sanctum')->check()。
3、若任一守卫返回 true,则 return $next($request);否则 return response()->json(['error' => 'Unauthenticated.'], 401);
4、注册中间件别名:'multi-auth' => \App\Http\Middleware\MultiGuardAuth::class
5、在路由中使用:Route::get('/unified/resource', [ResourceController::class, 'show'])->middleware('multi-auth');










