Laravel 多用户类型 JWT 认证需四步对齐:1. config/auth.php 中定义独立 guard 并绑定专属 provider;2. 各用户模型实现 JWTSubject 接口并注入 guard 标识;3. 路由显式指定 middleware('auth:admin') 且登录/刷新用对应守卫;4. 黑名单按 guard 隔离,修改缓存 key 或数据库字段前缀。

要让 Laravel 中不同用户类型的路由走各自的 JWT 守卫(比如 user、admin、merchant),关键不是“给路由加个参数”,而是从守卫定义、模型适配、中间件调用到 token 行为全部对齐。错一个环节,就会出现 401、Auth::user() 为空、token 冲突等问题。
1. 在 config/auth.php 中正确定义多个 JWT guard
每个用户类型需对应一个独立 guard,并明确绑定专属 provider:
-
guard 名必须唯一且语义清晰,例如
'admin'、'merchant',不能复用'api'或只改 provider -
driver 必须设为
'jwt'(前提是已安装并配置 tymon/jwt-auth) -
provider 必须指向独立的用户提供者,如
'provider' => 'admins'
示例配置片段:
'guards' => [
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
'admin' => [
'driver' => 'jwt',
'provider' => 'admins',
],
'merchant' => [
'driver' => 'jwt',
'provider' => 'merchants',
],
],2. 为每个用户模型配置独立 provider 并实现 JWTSubject
provider 只是“数据源声明”,真正起作用的是模型本身是否支持 JWT 签发与解析:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 在
config/auth.php的providers中新增对应项,model 指向真实类,如App\Models\Admin::class - 每个模型必须 implements JWTSubject 接口,并实现两个方法:
•getJWTIdentifier():返回唯一主键(通常是$this->getKey())
•getJWTCustomClaims():建议加入'guard' => 'admin'等标识字段,用于后续黑名单/刷新隔离
3. 路由组必须显式指定 guard 名,中间件不能省略
JWT 守卫不共享上下文,auth:api 和 auth:admin 是完全不同的认证流程:
- 写法必须是
middleware('auth:admin'),不能只写middleware('auth')或middleware('auth:api') - 登录接口也需匹配——管理员登录必须用
Auth::guard('admin')->login($admin),而非Auth::login($admin)(后者走默认 guard) - 刷新 token 同理:
Auth::guard('admin')->refresh(),否则可能返回 user 的新 token
4. 黑名单与 token 存储需按 guard 隔离(易忽略但致命)
tymon/jwt-auth 默认黑名单是全局单例,若不处理,Auth::guard('admin')->logout() 可能误删 user 的 token:
- 在
getJWTCustomClaims()中统一注入'guard' => $this->getGuardName()(如'admin') - 重写
JWTBlacklist::add()方法,把 payload 中的 guard 值拼入缓存 key 或数据库字段,例如blacklist:admin:xxx - 确保
config/jwt.php中'blacklist_enabled' => true,且 storage 方式(redis/db)支持前缀区分










