位置:首页 > PHP > Laravel中JWT多用户Token解析与当前登录用户获取方法

Laravel中JWT多用户Token解析与当前登录用户获取方法

时间:2026-08-20  |  作者:多维游侠  |  阅读:0

在 Lara vel 里要把 JWT 多用户系统跑顺,关键就在于 Token 的 payload 里带上 user_id 和 user_type 这两个字段。

拿到请求后,可以借助自定义中间件先把 Token 解析出来,再按用户类型动态加载对应的模型实例。

也可以单独封装一个 JwtHelper::currentJwtUser() 方法,用来直接获取当前用户。

再进一步的话,还能扩展 Auth Guard,让它同时支持多模型,并且继续兼容 Auth::user() 这类常规调用。

JWT多用户token解析Lara vel获取当前登录用户

在 Lara vel 里用 JWT(JSON Web Token)搭建多用户体系时,比如普通用户、管理员、商家这类不同角色,想拿到当前登录用户,关键不在“猜”是谁登录了。

重点在于把 Token 解析准确,再根据其 payload 里的用户标识,例如 user_iduser_type,去对应的模型中把用户实例加载出来。

问题也恰恰出在这里:Lara vel 自带的 Auth 机制默认是围绕单一用户模型设计的,碰到多模型场景,就需要手动做适配。

Token 中应携带用户类型与 ID

JWT 的 payload 必须明确区分用户来源。推荐在签发 Token 时写入两个关键字段:

  • user_id:用户的主键 ID(整型或字符串均可)
  • user_type:标识用户所属模型,例如 "AppModelsUser""AppModelsAdmin" 或简写为 "user" / "admin"

示例签发逻辑(使用 tymon/jwt-auth):

$payload = [
'user_id' => $user->id,
'user_type' => get_class($user), // 或自定义字符串
];
$token = JWTAuth::fromUser($user, $payload);

中间件中解析并绑定当前用户

如果不依赖 Lara vel 默认的 auth:api,可以自建中间件,例如 EnsureJwtUser

在请求进入时,先解析 Token,再设置全局可访问的用户实例。

  • 调用 JWTAuth::parseToken()->getPayload() 获取解码后的数组
  • 读取 user_iduser_type,动态实例化对应模型
  • Auth::guard('api')->setUser($modelInstance) 或直接存入 request 属性(如 $request->auth_user = $user

注意:避免直接调用 Auth::user(),除非你已重写 guard 的 user() 方法以支持多模型。

封装通用的当前用户获取方法

可以在 app/Helpers/JwtHelper.phpapp/Http/Controllers/Controller.php 基类中提供静态方法。

这样控制器里就不需要重复写 Token 解析逻辑。

public static function currentJwtUser()
{
try {
$payload = JWTAuth::parseToken()->getPayload();
$userClass = $payload['user_type']  'AppModelsUser';
$userId = $payload['user_id']  null;

if ($userId && class_exists($userClass)) {
return $userClass::find($userId);
}
} catch (Exception $e) {
// Token 无效或过期
}

return null;
}

控制器中即可直接调用 JwtHelper::currentJwtUser() 获取实例,无需重复解析逻辑。

配合 Lara vel Auth Guard(进阶用法)

如果希望继续使用 Auth::user(),可扩展一个支持多模型的 guard。

  • 继承 IlluminateAuthTokenGuard 或实现 IlluminateContractsAuthGuard
  • 重写 user() 方法:先解析 JWT payload,再按 user_type 加载模型
  • config/auth.php 中注册该 guard,并在路由中使用 auth:multi-jwt

这种方式更契合 Lara vel 原有生态。

不过也要注意,session、remember token 等机制在无状态 JWT 场景下通常不启用。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多