Laravel JWT多用户认证关键在于配置独立guard与provider:在auth.php中为users、admins等定义专属guard及对应model provider,路由中间件显式指定guard名(如auth:api_admin),登录时调用Auth::guard('xxx')->attempt(),访客等无库用户需自定义UserProvider实现动态解析。

要在 Laravel 中让 JWT 认证中间件支持多用户类型(比如 users 表的普通用户 + admins 表的后台管理员,甚至 guest 临时访客),关键不是堆砌多个中间件或改写核心包,而是从认证守卫(Guard)和用户提供者(Provider)两层做可扩展配置。默认的 auth:api 中间件只认一个 user model 和一个 provider,必须让它“知道”不同请求该查哪张表、用哪个模型。
明确区分 Guard 配置
在 config/auth.php 中为每类用户定义独立守卫,避免混用:
- 每个 guard 指向专属 provider,例如:
'api_user' => ['driver' => 'jwt', 'provider' => 'users']和'api_admin' => ['driver' => 'jwt', 'provider' => 'admins'] - provider 名称需与下方
providers数组键名一致,且各自绑定对应模型:'users' => ['model' => App\Models\User::class],'admins' => ['model' => App\Models\Admin::class] - 路由分组时显式指定 guard:比如后台接口加
middleware => 'auth:api_admin',前台接口用auth:api_user
动态切换 JWT 的用户模型
若不想为每种用户建新 guard(比如访客无数据库记录),可在中间件中临时覆盖 JWT 的 model 配置:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 创建中间件如
AdminGuardMiddleware,在handle()中执行:config(['jwt.user' => App\Models\Admin::class]);和config(['auth.providers.users.model' => App\Models\Admin::class]); - 注意:这个操作只影响当前请求生命周期,不会污染其他请求
- 配合路由分组使用,例如
Route::prefix('admin')->middleware(AdminGuardMiddleware::class)->group(...)
自定义 Provider 支持无库用户
对 guest 类型用户,标准 provider 查不到数据库记录,需实现一个能解析自定义声明的 provider:
- 新建类如
DynamicUserProvider,实现Illuminate\Contracts\Auth\UserProvider接口 - 重写
retrieveById():当$identifier是数字 ID 时查 users 表;当是guest_*格式时,构造一个匿名 User 实例并设置 role = 'guest' - 在
config/auth.php中注册该 provider:'guests' => ['driver' => 'dynamic', 'model' => App\Models\User::class] - 对应 guard 使用它:
'api_guest' => ['driver' => 'jwt', 'provider' => 'guests']
Token 生成时匹配对应 Guard
登录逻辑里不能只调 Auth::attempt(),要确保生成的 token 绑定正确的 guard:
- 普通用户登录:
Auth::guard('api_user')->attempt($credentials) - 管理员登录:
Auth::guard('api_admin')->attempt($credentials) - 访客登录:不用
attempt,改用JWTFactory::sub('guest_'.Str::random(8))->role('guest')->make()手动生成 token - 返回 token 前,检查
JWTAuth::setToken($token)->authenticate()是否成功,避免空用户通过

















