laravel支持jwt多角色多表认证需为每个角色(user、admin、merchant)独立配置guard、provider和model,并在模型中实现jwtsubject接口、返回含'guard'标识的自定义声明,所有认证操作必须显式指定guard名。

要让 Laravel 支持 JWT 多角色(如 user、admin、merchant)多表认证,核心不是“改一个配置”,而是建立多个隔离的认证通道——每个角色对应独立的 guard + provider + model,且 token 生命周期、黑名单、中间件全部按角色切分。环境搭建必须从底层结构入手,不能只动 jwt.php 或临时改 config。
安装与初始化 JWT 扩展
使用稳定兼容的版本(推荐 tymon/jwt-auth:^1.0):
- 执行
composer require tymon/jwt-auth:^1.0 - 发布配置:
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider",生成config/jwt.php - 生成密钥:
php artisan jwt:secret,密钥自动写入.env的JWT_SECRET,切勿提交或随意更换
定义角色模型并实现 JWTSubject
每个用户表对应一个 Eloquent 模型,例如 App\Models\User、App\Models\Admin、App\Models\Merchant:
- 模型需 实现
Tymon\JWTAuth\Contracts\JWTSubject接口 -
getJWTIdentifier()返回主键值(如$this->id) -
getJWTCustomClaims()必须返回含'guard' => 'admin'等标识的数组,用于后续 token 隔离
配置多 guard 与 provider(关键步骤)
修改 config/auth.php,在 'guards' 和 'providers' 中分别追加角色项:
- 新增 guard:
'admin' => ['driver' => 'jwt', 'provider' => 'admins'] - 新增 provider:
'admins' => ['driver' => 'eloquent', 'model' => App\Models\Admin::class] - 同理添加
'merchant'guard 和'merchants'provider - 确保各 guard 的
provider名与 providers 数组中键名完全一致
验证基础通路是否跑通
每完成一组配置,立即验证最小闭环:
- 用
Auth::guard('admin')->login($admin)手动生成 admin token(注意:不能用Auth::login(),它走默认 guard) - 请求头带
Authorization: Bearer xxx,路由加middleware('auth:admin') - 在控制器中用
Auth::guard('admin')->user()获取当前管理员,确认非 null
不复杂但容易忽略:所有环节——路由中间件、登录逻辑、token 刷新、登出操作——都必须显式指定 guard 名,否则默认走 api 或 web,导致跨角色混用。











