Laravel中JWT多用户身份区分本质是动态切换认证模型与守卫上下文,需同步配置jwt.user和auth.providers.users.model指向同一模型,推荐通过中间件或定义多provider(如admin-api)实现隔离,各模型须实现JWTSubject接口。

JWT 多用户身份区分在 Laravel 中本质不是“改一堆配置”,而是动态切换认证模型与守卫上下文。核心在于:同一套 JWT 逻辑,通过运行时指定不同 User 模型和 provider,实现 user/admin/agent 等多表独立登录、签发、校验,互不干扰。
关键配置项必须对齐
JWT 包(tymon/jwt-auth)依赖两个配置协同工作:
-
jwt.user:决定
JWTAuth::fromUser()或auth('api')->user()实例化哪个模型 -
auth.providers.users.model:决定 guard 在验证凭据(
attempt())时查哪张表、用哪个模型
二者必须指向同一个模型类,否则会出现「登录成功但获取不到用户」或「token 解析出错」等问题。
中间件动态切换模型最稳妥
不要硬编码改 config/jwt.php 或全局 config,而是在路由分组中用中间件实时设置:
- 为 admin 路由加中间件,在 handle() 中执行:
config(['jwt.user' => \App\Models\Admin::class]);config(['auth.providers.users.model' => \App\Models\Admin::class]); - 为 user 路由用默认配置,或另配一个中间件切换回
\App\Models\User - 确保该中间件在
auth:api之前执行,否则 guard 已初始化,再改 model 无效
Guard 需配合多 provider(可选但推荐)
若希望语义更清晰、避免中间件污染,可在 config/auth.php 中定义多个 provider:
- 保留
'users'provider 指向 User 模型 - 新增
'admins'provider,model 设为\App\Models\Admin::class - 对应定义
'admin-api'guard,driver 为jwt,provider 为admins - 登录时显式调用
auth('admin-api')->attempt(...),无需中间件干预
模型必须实现 JWTSubject 接口
每个参与 JWT 认证的模型(User、Admin、Agent)都需:
- 继承
Authenticatable(或至少实现AuthenticatableContract) - 实现
JWTSubject接口,提供getJWTIdentifier()和getJWTCustomClaims() - 确保主键字段名一致(如都是
id),或在getJWTIdentifier()中显式返回正确字段


















