后台会话策略(README)
本文档记录管理员后台会话策略的现状、优化建议与后续启用指引,便于根据安全与体验需求做选择或演进。
现状(已生效)
- 会话模型:滑动空闲过期(Idle Timeout)。
- 默认时长:
120分钟。 - 生效位置:
api/app/base/controller/AdminBaseController::getAdmin()。 - 实现要点:
- 读取
Env::get('app.user_expired_time', 120)(单位:分钟)。 - 过期判断:
admin_user_token.update_time + app.user_expired_time*60 < now则会话失效。 - 未过期时:每次请求刷新
update_time = now(滑动窗口)。 - 失效返回:
ERROR_TOKEN,前端清除 token 并跳转/login。
- 读取
建议(暂不启用)
为提升整体安全性,建议在滑动空闲过期的基础上增加“绝对最长会话时长(Absolute Max TTL)”。当前暂不启用,但建议值如下,供后续选择:
- 管理员:绝对最长
8–12小时;空闲超时保持120分钟。 - 超管/高敏操作:绝对最长
4–8小时;空闲超时30–60分钟。 - 内网/演示环境:可不设绝对最长或设置为
24小时;空闲超时放宽240–480分钟。
引入绝对最长会话时长可避免因心跳或高频操作让会话无限续期,降低被劫持后长期存活的风险;同时需要权衡长任务被强制中断的体验影响。
启用指引(未来)
若后续需要启用“绝对最长会话时长”,建议按以下步骤:
环境配置(单位:分钟)
- 在
api/.env或api/env-master增加:app.user_absolute_max_time = 720(示例为 12 小时)或1440(24 小时)。
- 在
基准字段选择
- 优先以
AdminUserToken.create_time作为绝对过期的时间基准。 - 若未启用模型自动时间戳,可在发放 token 时补充专用字段(如
login_time)作为基准。
- 优先以
统一校验位置
- 在
AdminBaseController::getAdmin()中与空闲过期同时校验:- 绝对过期:
(base_time + app.user_absolute_max_time*60) < now则失效。 - 空闲过期:沿用现有
update_time判断。 - 未过期:刷新
update_time = now,保持滑动窗口。
- 绝对过期:
- 在
前端联动
- 后端返回
ERROR_TOKEN或401时,现有逻辑会在web/src/api/base/error-engine.js调用handleTokenInvalid(),清除 token 并跳转/login。 - 可选优化:在到期前增加提示或倒计时弹窗,降低强制中断的体验影响。
- 后端返回
变更影响与运维建议
- 影响评估:
- 安全性提升:限制会话上限,避免无限续期。
- 体验影响:长任务与夜间会话可能被强制中断。
- 运维建议:
- 按环境差异配置(开发/测试/生产)。
- 监控会话超时次数与登录重试行为,作为调参依据。
- 灰度启用绝对最长会话时长,并保留快速回滚方案。
参考与定位
- 后端会话校验:
api/app/base/controller/AdminBaseController::getAdmin()。 - 环境变量:
app.user_expired_time(滑动空闲过期,分钟)。app.user_absolute_max_time(绝对最长会话时长,分钟,建议后续引入)。
- 前端错误处理与跳转:
web/src/api/base/error-engine.js。