Laravel中JWT多用户Token解析与当前登录用户获取方法
时间:2026-08-20 | 作者:多维游侠 | 阅读:0在 Lara vel 里要把 JWT 多用户系统跑顺,关键就在于 Token 的 payload 里带上 user_id 和 user_type 这两个字段。
拿到请求后,可以借助自定义中间件先把 Token 解析出来,再按用户类型动态加载对应的模型实例。
也可以单独封装一个 JwtHelper::currentJwtUser() 方法,用来直接获取当前用户。
再进一步的话,还能扩展 Auth Guard,让它同时支持多模型,并且继续兼容 Auth::user() 这类常规调用。
在 Lara vel 里用 JWT(JSON Web Token)搭建多用户体系时,比如普通用户、管理员、商家这类不同角色,想拿到当前登录用户,关键不在“猜”是谁登录了。
重点在于把 Token 解析准确,再根据其 payload 里的用户标识,例如 user_id 和 user_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_id和user_type,动态实例化对应模型 - 用
Auth::guard('api')->setUser($modelInstance)或直接存入 request 属性(如$request->auth_user = $user)
注意:避免直接调用 Auth::user(),除非你已重写 guard 的 user() 方法以支持多模型。
封装通用的当前用户获取方法
可以在 app/Helpers/JwtHelper.php 或 app/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 场景下通常不启用。
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- 迅捷路由器怎么调信号最强,设置时要注意什么?
- 时间:2026-08-27
-
- vivo浏览器怎么卸不掉?原因和解决方法在这里
- 时间:2026-08-27
-
- OPPO R11s黑屏了,怎么强制恢复出厂设置?
- 时间:2026-08-27
-
- 飞利浦显示器包装盒有生产日期和保修期吗?怎么看?
- 时间:2026-08-27
-
- 联想新平板开机必须联网吗?怎么做?
- 时间:2026-08-27
-
- 平板横竖屏切换设置与问题解决
- 时间:2026-08-27
-
- 移动电源容量怎么测?要准备哪些工具?
- 时间:2026-08-27
-
- 荣耀90 Pro防水吗?防水级别多少?怎么用才安全
- 时间:2026-08-27
精选合集
更多大家都在玩
大家都在看
更多-
- 糖尿病完全不能吃糖吗
- 时间:2026-09-15
-
- 蚂蚁庄园小课堂2026年9月16日最新题目答案
- 时间:2026-09-15
-
- 小鸡答题今天的答案是什么2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园每日答题答案2026年9月16日
- 时间:2026-09-15
-
- 以下哪种粮食是酿造绍兴黄酒的主要原料 蚂蚁庄园今日答案9月16日
- 时间:2026-09-15
-
- 劝学名句“及时当勉励,岁月不待人”出自哪位诗人 蚂蚁庄园今日答案9.16
- 时间:2026-09-15
-
- 蚂蚁庄园今天答题答案2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园答题今日答案2026年9月16日
- 时间:2026-09-15
