laravel 多用户类型 jwt 认证需配置多组 guard、provider 和 model,并隔离路由与中间件。1. 在 config/auth.php 中定义 api 和 admin-api 两套 guard;2. user 和 admin 模型均实现 jwtsubject 接口;3. 分设 login 路由及控制器方法,显式调用对应 guard;4. 保护路由时指定 auth:api 或 auth:admin-api 中间件。

要实现 Laravel 中多个用户类型(比如普通用户 users 和后台管理员 admins)各自独立签发、验证 JWT 令牌,关键不是“改包”,而是配置多组 guard + provider + model + 路由隔离。tymon/jwt-auth 支持开箱即用的多用户认证,无需魔改源码。
1. 配置多个认证守卫(guards)
在 config/auth.php 中定义两套 guard:
-
api:用于普通用户(users表) -
admin-api:用于管理员(admins表)
示例配置:
return ['defaults' => ['guard' => 'api', 'passwords' => 'users'],
'guards' => [
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
'admin-api' => [
'driver' => 'jwt',
'provider' => 'admins',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
'admins' => [
'driver' => 'eloquent',
'model' => App\Models\Admin::class,
],
],
];
2. 为每个用户模型实现 JWTSubject 接口
确保两个模型都正确实现接口,并返回对应主键和自定义声明:
-
App\Models\User:已实现JWTSubject,getJWTIdentifier()返回$this->id -
App\Models\Admin:同样实现,注意表名、填充字段、密码加密逻辑需匹配admins表结构
Admin 模型示例节选:
namespace App\Models;use Illuminate\Foundation\Auth\User as Authenticatable;
use Tymon\JWTAuth\Contracts\JWTSubject;
class Admin extends Authenticatable implements JWTSubject
{
protected $table = 'admins';
protected $fillable = ['name', 'email', 'password'];
public function getJWTIdentifier()
{
return $this->getKey(); // 即 $this->id
}
public function getJWTCustomClaims()
{
return ['type' => 'admin']; // 可用于后续中间件区分身份
}
}
3. 分开定义登录路由与控制器方法
路由前缀与中间件明确隔离,避免混用:
-
api/login→ 使用auth:apiguard 登录 User -
api/admin/login→ 使用auth:admin-apiguard 登录 Admin
示例控制器方法(AuthController & AdminAuthController):
// 普通用户登录public function login()
{
$credentials = request(['email', 'password']);
if (!$token = auth('api')->attempt($credentials)) {
return response()->json(['error' => 'Unauthorized'], 401);
}
return $this->respondWithToken($token);
}
// 管理员登录
public function adminLogin()
{
$credentials = request(['email', 'password']);
if (!$token = auth('admin-api')->attempt($credentials)) {
return response()->json(['error' => 'Unauthorized'], 401);
}
return $this->respondWithToken($token);
}
4. 保护不同资源时指定对应 guard
中间件调用必须显式传入 guard 名称,否则默认走 api:
-
middleware => 'auth:api'→ 验证 user token -
middleware => 'auth:admin-api'→ 验证 admin token
路由示例:
Route::middleware('auth:api')->group(function () {Route::get('/user/profile', [ProfileController::class, 'show']);
});
Route::prefix('admin')->middleware('auth:admin-api')->group(function () {
Route::get('/dashboard', [AdminDashboardController::class, 'index']);
});











