JWT在多用户生产环境需分角色隔离守卫、分级密钥管理、分层令牌策略及精准路由控制。应配置admin-api、api、third-party等独立guard,分别绑定对应provider与密钥;管理员强制RS256+KMS私钥,普通用户HS256+前缀密钥;TTL按角色设为10/30/一次性,刷新机制差异化;敏感路由叠加权限中间件,禁用none算法,Nginx限制未发布API路径。

JWT在多用户生产环境里,不能只靠“生成令牌+验证”就完事。关键是要让不同角色、不同来源、不同敏感度的请求各走各的路,互不干扰,同时防住伪造、重放、越权和泄露。
守卫(Guard)按角色隔离配置
一个项目常有普通用户、管理员、API调用方(如第三方系统)三类主体,不能共用同一套JWT守卫。必须在config/auth.php中定义多个guard,并明确绑定不同provider和driver:
- 为管理员单独建
'admin-api'守卫,驱动设为jwt,provider指向admins(对应Admin模型) - 普通用户用
'api'守卫,provider为users - 第三方系统调用建议用
'third-party'守卫,配合独立密钥(JWT_SECRET_THIRD_PARTY)和更短TTL(如15分钟) - 所有guard的
user字段必须严格限定模型路径,避免通过修改payload中的sub或id绕过模型校验
密钥与算法分级管理
别让所有JWT都用同一个APP_KEY签名。高风险场景必须升级算法并隔离密钥:
- 管理员令牌强制使用
RS256,私钥仅存于服务器内存或KMS服务,公钥由storage/jwt/admin-public.pem提供 - 普通用户仍可用
HS256,但密钥从.env读取时加前缀区分:JWT_SECRET_USERS、JWT_SECRET_ADMINS - 禁用
none算法,在config/jwt.php中显式设置'allowed_algs' => ['HS256', 'RS256'] - 每次部署自动轮换密钥,避免长期复用——可结合Laravel的
php artisan jwt:secret --force与CI/CD脚本执行
令牌生命周期与刷新策略分层
统一设60分钟TTL看似省事,实则埋下越权隐患。应按角色动态控制:
- 普通用户:访问令牌
ttl=30分钟,刷新令牌refresh_ttl=1440(24小时),且刷新时校验IP+User-Agent指纹 - 管理员:访问令牌
ttl=10分钟,刷新令牌refresh_ttl=60分钟,每次刷新强制要求二次验证(如短信验证码) - 第三方调用:禁用刷新机制,令牌一次性有效,过期即需重新授权
- 所有刷新操作记录日志,含
old_jti、new_jti、ip、user_agent,便于审计异常连刷
路由与中间件精准绑定
JWT不是万能胶,不能全站套一个auth:api。必须按业务粒度收紧入口:
- 敏感操作(如删除账号、修改权限)路由必须叠加
can:delete-user或自定义中间件,不能仅依赖token存在 - 开放接口(如获取公开商品列表)禁用JWT守卫,改用
throttle:60,1防爬 - 管理后台API若走Web路由(如SPA),需同时启用
web+auth:sanctum中间件,而非混用auth:api - 所有JWT路由加
prefix: 'api/v1',并在Nginx层拒绝/api/v2/等未发布路径的访问


















