登录鉴权与权限
管理端登录
- 管理员账号密码登录(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 记录为会员的注册来源。