admin-session-stability-2026-10-13.md 2.5 KB

管理后台操作中自动退出:排查与修复(2026-10-13)

用户确认问题发生在操作过程中。当前发现并修复的是前端误退出路径;没有留存用户当次失败请求的网络记录,因此不把某一次具体 401 的上游原因视为已复现。

核实结果

  • 生产只读检查发现 25 个管理员会话,期限约 365 天且均有效。没有发现后台设置了分钟级会话期限;未延长服务器会话期限。
  • admin/operations 的任意 HTTP 401 都会直接调用 logout(),该方法会清除本地状态并向服务端注销会话,没有先核实该 token 是否真的失效。
  • app 接口额外把所有 HTTP 403 也视为登录失效,混淆了操作权限不足和登录过期。
  • 请求失败时注销的是“当前”会话,而不是请求发出时的会话;旧请求的迟到错误能影响新登录。
  • 登录页在身份信息查询或后续导航失败时无条件注销刚刚成功的登录。
  • sessionStorage 只随当前标签页保存,是重开标签页丢失登录的独立问题,并非用户本次操作中退出的充分解释。

修复行为

  1. 业务网关返回鉴权错误时,使用同一个请求 token 调用 Parse /users/me 复核;并发检查合并,不重发原业务写操作。会话有效或复核网络故障时保留登录;确认 token 无效、账号停用或删除时清除状态并返回登录页。
  2. 普通 403 权限拒绝只返回操作错误。失效处理按请求 token 匹配当前会话,且不再发送多余的服务端 logout。
  3. 登录成功后身份查询遇到网络/服务错误不再注销;新登录明确没有管理员权限时才退出该次登录。旧身份元数据也不能覆盖其他账号。
  4. 登录状态持久保存并兼容现存标签页会话;跨标签页主动退出同步清除,保留返回原页面的地址。服务器权限验证仍是业务请求的依据。

验证边界

  • ChromeHeadless:会话服务、云请求服务、登录组件、页面缓存和实时刷新共 27 项测试通过。
  • 管理后台生产构建通过,只有已有样式预算/CommonJS 警告。
  • 真实 Parse /users/me 返回 HTTP 200,验证端点可用;临时只读检查函数已删除。
  • 本机 http://127.0.0.1:4300 页面及脚本 HTTP 200,实际脚本包含新会话复核、持久保存及按 token 失效处理。
  • 未宣称已经复现用户当时的具体失败接口,也未把本机构建等同线上静态站点发布。