Laravel 中实现多用户类型 JWT 签发需配置多个 guard 与 provider,各模型实现 JWTSubject 并注入 type claim;登录路由分离,中间件动态切换 guard,refresh/logout 操作须显式指定 guard。

在 Laravel 中实现多用户类型(如 admin、user、merchant)的 JWT 签发,核心在于分离认证守卫(guards)、提供独立的用户模型与登录逻辑,同时确保 JWT Token 能准确携带并识别用户类型。不推荐强行复用同一 guard 或混用模型,否则会带来鉴权混乱和 token 解析歧义。
配置多个认证守卫与提供器
在 config/auth.php 中定义不同 guard,每个对应专属用户模型和 provider:
- 为
admin添加 guard:'admin' => ['driver' => 'jwt', 'provider' => 'admins'] - 为
merchant添加 guard:'merchant' => ['driver' => 'jwt', 'provider' => 'merchants'] - 对应 provider 需声明模型路径,例如:
'admins' => ['driver' => 'eloquent', 'model' => App\Models\Admin::class] - 确保各模型均实现
JWTSubject接口,并重写getJWTIdentifier()和getJWTCustomClaims(),可在 claims 中显式注入类型标识,如['type' => 'admin']
独立登录路由与签发逻辑
避免共用 /login,按类型拆分接口更清晰、安全且利于前端处理:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
-
POST /api/admin/login→ 使用Auth::guard('admin')->attempt($credentials) -
POST /api/user/login→ 使用默认web或自定义userguard - 签发成功后,调用
auth('admin')->claims(['type' => 'admin'])->login($admin),确保 type 字段进入 payload - 返回结构统一含
token、type、expires_in,便于前端路由/权限分流
中间件实现动态守卫解析
针对需要支持多类型访问的 API(如后台通用接口),可编写中间件自动识别 token 中的 type claim 并切换 guard:
- 从 request bearer token 解码 payload(可用
JWTAuth::getPayload()或JWTAuth::parseToken()->getPayload()) - 提取
type值,映射到对应 guard 名(如admin → 'admin',merchant → 'merchant') - 调用
Auth::shouldUse($guardName)切换当前守卫上下文 - 后续
auth()->user()即返回对应模型实例,无需重复解码或手动查询
刷新与登出需守卫对齐
JWT 的 refresh 和 logout 操作必须明确指定 guard,否则默认使用 config 中 defaults.guard,易导致误操作:
- 刷新 token:使用
auth('admin')->refresh(),而非auth()->refresh() - 登出:调用
auth('merchant')->logout(true)(true表示废止 refresh token) - 建议在请求 header 或 query 中传递
guard=merchant参数,由中间件统一接管 guard 选择,避免客户端硬编码守卫名

















