laravel中实现jwt多用户类型校验需统一解析token后根据payload的guard字段动态切换认证守卫:1.生成token时写入guard字段;2.编写中间件提取token、校验guard白名单并调用对应守卫authenticate();3.配置多个jwt guard及对应provider;4.路由中使用中间件并传参限定合法guard。

在 Laravel 中实现 JWT 多用户类型(如 admin、user、merchant)的令牌校验,关键不在于“多个 token”,而在于统一解析 token 后,根据 payload 中的用户类型(如 type 或 guard 字段)动态切换认证守卫(guard),并完成对应模型的查询与授权。自定义中间件是实现这一逻辑最清晰、可复用的方式。
1. 确保 JWT 令牌携带用户类型标识
生成 token 时,必须在 payload 中显式写入用户身份类型,例如:
- 登录 admin 时:
JWTAuth::fromUser($admin, ['type' => 'admin']) - 登录普通用户时:
JWTAuth::fromUser($user, ['type' => 'user']) - 推荐使用标准字段如
guard(与 Laravel guard 名称一致),便于后续映射
2. 编写多守卫 JWT 校验中间件
运行命令创建中间件:
php artisan make:middleware MultiGuardJwtAuth
编辑 app/Http/Middleware/MultiGuardJwtAuth.php,核心逻辑如下:
- 从请求头提取 Bearer token
- 尝试解析 token 获取 payload,重点读取
guard字段 - 校验该
guard是否在白名单中(如['api', 'admin-api', 'merchant-api']) - 调用
Auth::guard($guard)->setToken($token)->authenticate()完成模型实例绑定 - 若失败,统一返回 401 并提示“无效或过期的令牌”
3. 配置多个 API Guard(关键步骤)
在 config/auth.php 的 'guards' 数组下添加对应 guard:
'admin-api' => [
'driver' => 'jwt',
'provider' => 'admins'
],
'merchant-api' => [
'driver' => 'jwt',
'provider' => 'merchants'
]
同时在 'providers' 中配置对应 Eloquent provider,指向各自的 Model(如 App\Models\Admin)。
4. 在路由中使用中间件并传参(可选增强)
可在中间件别名中预设允许的 guards,提高复用性:
Route::middleware(['multi.guard:admin-api,merchant-api'])->group(function () { ... });
此时中间件构造函数接收 $guards 字符串,explode(',', $guards) 得到数组,用于校验 payload 中的 guard 值是否合法。
不复杂但容易忽略:token 解析后必须调用 Auth::shouldUse($guard) 或直接使用指定 guard 的 authenticate(),否则 Laravel 默认仍走 api guard,导致模型查询失败。











