Laravel 支持多用户模型(User、Admin、Merchant)独立 JWT 登录,需为每个模型实现 JWTSubject 接口、配置专属 guard(如 admin-api)和 provider(如 admins)、使用对应守卫(auth('admin-api'))登录与验证,并通过中间件 auth:admin-api 保护路由。

要在 Laravel 中支持多个用户模型(比如 User、Admin、Merchant)各自独立登录并生成 JWT Token,不能只靠默认的 auth:api 守卫。核心在于为每个模型配置专属的 guard 和 provider,并让 jwt-auth 正确识别不同模型的上下文。
1. 安装与基础密钥准备
确保使用 tymon/jwt-auth 1.x 版本(兼容 Laravel 9/10/11):
- 运行
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
2. 为每个模型实现 JWTSubject 接口
每个需认证的模型(如 App\Models\Admin)都必须实现接口并提供唯一标识:
- 在
Admin.php中添加:use Tymon\JWTAuth\Contracts\JWTSubject;class Admin extends Model implements JWTSubject - 实现两个方法:
public function getJWTIdentifier()→ 返回主键(如$this->id)public function getJWTCustomClaims()→ 可返回['type' => 'admin']用于后续鉴权区分
3. 配置多 guard 与 provider
修改 config/auth.php:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 在
'guards'下新增守卫:'admin-api' => [ 'driver' => 'jwt', 'provider' => 'admins' ] - 在
'providers'下新增提供者:'admins' => [ 'driver' => 'eloquent', 'model' => App\Models\Admin::class ] - 同理可添加
'merchant-api'/'merchant'等组合
4. 创建对应认证控制器与路由
以管理员登录为例:
- 路由(
routes/api.php):Route::post('admin/login', [AdminAuthController::class, 'login']); - 控制器中指定守卫:
Auth::guard('admin-api')->attempt($credentials)
或直接使用auth('admin-api')辅助函数 - 登录成功后返回 token,后续请求头带
Authorization: Bearer {token}即可被auth:admin-api中间件识别
5. 中间件与权限控制建议
保护路由时明确指定 guard:
Route::middleware('auth:admin-api')->group(...)- 在控制器中获取当前用户:
auth('admin-api')->user() - 如需统一拦截多模型 Token,可自定义中间件检查
getJWTCustomClaims()['type']字段做路由分发
不复杂但容易忽略:每个模型的 Token 是相互隔离的,无法混用;刷新 Token 也必须使用对应 guard(auth('admin-api')->refresh()),否则会报错。

















