-
Notifications
You must be signed in to change notification settings - Fork 0
01 login permission and session faq
本文汇总 LIMIS 中与 登录认证、模块权限、JWT 与会话版本、菜单与路由权限 相关的常见问题,并与知识库其他章节交叉引用。技术细节以当前代码实现为准。
相关主文档:认证与 JWT · 授权模型 · 系统管理界面 · 前端请求信封 · 既有:权限排错 · 既有:会话安全
可能原因包括:
- 大小写与空格:用户名、密码是否多打了空格;密码是否区分大小写(取决于组织策略,系统底层校验为 Django 认证)。
-
账号被禁用:后端对
is_active=False的账号会拒绝登录并可能返回与密码错误相同的提示(避免枚举有效账号)。请管理员在 系统管理 → 用户 中检查账号状态,参见 系统管理界面。 -
登录失败锁定:若在配置中启用了
LOGIN_FAILURE_MAX_ATTEMPTS等,同一用户名 + IP 在窗口内失败次数过多会触发 节流(Throttled),提示稍后再试。详见 密码策略与登录节流 与 认证与 JWT。
建议:由管理员核对账号状态与锁定策略;用户侧避免在多台设备上反复试错。
通常与 Access Token 过期 或 会话版本(session_version)不一致 有关,见 §2。
若仅发生在某一浏览器:检查是否禁用 LocalStorage / 第三方 Cookie 策略导致刷新 Token 无法保存。
流程依赖现场策略:常见为管理员在 用户管理 中重置密码,或通过组织统一的 IAM/邮件重置。LIMIS 侧请查阅 系统管理界面 与 管理员快速上手。
LIMIS API 侧主要使用 JWT(Simple JWT):Access Token 用于请求鉴权,Refresh Token 用于刷新。与普通无状态 JWT 不同的是,系统在 Token 中携带 sv(session_version) 声明,并与数据库用户表中的 session_version 字段 对齐校验。
- 若数据库中的版本号 大于 Token 中的
sv,校验失败,效果等价于 「该用户所有已签发 Access/Refresh 一律作废」。 - 典型触发:用户 重新登录、管理员执行 踢出会话 等会 递增
session_version的操作。
实现参考:SessionVersionJWTAuthentication、SessionVersionRefreshToken。详见 认证与 JWT 与 既有:会话安全。
这是 设计行为:通过递增 session_version,使旧 Token 全部失效,避免已泄露 Token 在密码变更后仍长期有效。
-
单用户被踢:仅该用户的
session_version变化,仅影响该账号。 - 若误以为「全员掉线」:检查是否在运维操作中批量触发了用户更新、或网关/负载均衡层统一清除了客户端存储。
默认 允许(未在 FAQ 层面禁止多设备);每一端持有自己的 Token。若一端重新登录或管理员踢出,则 所有端 在下次请求校验失败时需重新登录。
若业务上要求「单端在线」,需在产品层增加策略(当前以会话版本递增实现「强制下线」为主)。
可能原因:
-
用户
session_version已在服务端递增(重新登录、踢出等),旧 Refresh 携带的sv不再匹配。 -
Token 被加入黑名单(若启用
token_blacklist应用)且已轮换失效。 -
时钟偏差过大:JWT
exp校验失败(少见,需校时)。
处理:重新登录。若频繁发生,抓包看 /token/refresh/ 请求体与响应,并对照服务端日志。
LIMIS 前端根据 路由元信息 与当前用户 权限列表 过滤菜单(见前端 permission 工具与侧边栏逻辑)。后端则通过 LimsModulePermission 与 ViewSet 上的 lims_module、HTTP 方法映射的 view/create/edit/delete 做校验。
可能情况:
- 角色未分配:用户未绑定角色,或角色未包含所需模块权限。请在 系统管理 → 角色 → 分配权限 中配置,参见 授权模型。
-
超级用户:
is_superuser通常绕过模块校验(以后端实现为准),但仍需登录有效 Token。 - 仅菜单隐藏:直接输入 URL 仍可能 403——说明 路由级 与 API 级 均需权限。
该文案对应后端 LimsModulePermission.message。表示当前用户对当前接口所属 模块 的 动作(如 view、edit)未授权。需调整角色权限或联系管理员,而非清空浏览器缓存。
常见于 GET 有 view,但 POST/PATCH 需要 create/edit。请核对角色是否包含对应模块的写权限;开发环境可在浏览器网络面板查看失败请求的 Method 与 URL,对照后端 ViewSet 的 lims_module 与 lims_action_map。
| 现象 | 优先检查 |
|---|---|
| 401 Unauthorized | Token 是否缺失、过期;Authorization: Bearer 格式是否正确;是否因 sv 不一致被判定为无效 Token |
| 403 Forbidden | 模块权限不足;是否为超级用户以外的业务规则拒绝 |
| 200 但业务 code 非成功 | 见 错误响应与业务码,可能与网关改写 code 类型有关(字符串 "200" vs 数字 200) |
前端开发 请同时阅读 前端请求信封,避免未解包 data 导致界面「像没权限」实际是未取到数据。
部分网关会把 JSON 中的数字转为字符串。前端请求层应对 成功码兼容数字与字符串(项目内 request.ts 约定),否则无法解包 data,界面表现为部分字段 undefined。详见 前端请求信封 与 API 约定与信封。
会导致所有请求 401。请确认 Nginx/网关未剥离该头;HTTPS 终止后转发到上游时保留头信息。参见 反向代理与 TLS。
登录失败计数可能按 用户名 + 客户端 IP 维度。若代理未正确配置 X-Forwarded-For,可能表现为 同一出口 IP 下多用户互相影响 或 锁定维度异常。运维需核对 部署与配置。
- 运维 FAQ:会话与登录相关故障(值班视角)
- 数据安全
- Git 与协作(若涉及权限配置变更的评审)
| 日期 | 版本 | 作者 | 摘要 |
|---|---|---|---|
| 2026-04-01 | 1.0 | Wiki | 初版:登录、JWT、会话版本、权限与网关 FAQ |