Skip to content

登录鉴权与权限 ​

管理端登录 ​

  • 管理员账号密码登录(bcrypt 校验),签发 JWT;
  • JWT Claims 携带 user_id、username、login_id、is_super、client;
  • 登录流水写入 sys_user_login,Redis 保存 login:<login_id> 会话缓存。

login_id 主动过期机制 ​

管理员与会员的令牌都携带 login_id,鉴权时以 Redis 缓存为准:

text
登录成功 → 生成 login_id → 写 Redis(有效期同 JWT)
退出/改密/被踢/被禁用 → 删除 Redis 缓存 → 令牌立即失效

因此 JWT 本身未过期不代表仍有效,Redis 缓存被删除即视为失效,实现主动过期,无需等待令牌自然过期。

会员单会话 ​

会员(C 端用户)令牌额外受 member_login:<会员ID> 缓存控制:

  • 会员登录时生成新的 login_id,写入 sys_member.login_id 并覆盖 Redis;
  • 同一账号重新登录后,旧令牌立即失效(单端登录语义);
  • 管理端禁用会员后,其在线会话同步删除,令牌即时失效。

JWT 中额外携带会员的昵称、用户编号(sn)与头像相对路径,鉴权通过后写入请求上下文供业务使用。

RBAC 权限 ​

  • 权限资源由菜单、页面、按钮组成,按钮通过 sys_menu.api_path 绑定接口,格式 METHOD:/path(多个用逗号分隔);
  • 角色绑定菜单权限,管理员绑定多个角色,支持多级角色(上级自动包含下级权限);
  • 普通管理员按接口权限精确匹配;超级管理员跳过接口权限匹配但仍需有效登录态;
  • 前端按钮通过 v-perm="'POST:/admin/user/add'" 控制显隐,后端权限中间件才是最终安全边界;
  • 菜单、角色、用户权限变更后必须清理权限缓存(perm:<user_id> 或全量)。

客户端令牌隔离 ​

JWT Claims 中的 client 字段区分 admin 与 api:

端允许的令牌说明
管理端 /admin/*仅 admin会员令牌调用管理端接口返回 401
用户端 /api/*仅 api管理员令牌调用用户端接口返回 401

平台来源与版本号请求头 ​

用户端所有接口必须携带:

Header必填说明
X-Platform-Source是平台来源:1 微信小程序、2 微信公众号、3 iOS、4 Android;缺失或非法返回 400
X-App-Version否客户端版本号,服务端透传写入上下文,暂不做一致性校验

注册接口会把 X-Platform-Source 记录为会员的注册来源。