在线用户租户上下文修复
status: completed
created: 2026-08-03
complexity: simple
1. 问题
认证登录在登录态建立前会查询旧在线会话并写入 sys_auth_online_user,此时 HTTP 租户拦截器无法从 Session 建立租户上下文;在线用户过期清理运行在调度线程,也没有请求租户上下文。严格租户模式因此抛出:
访问租户表[sys_auth_online_user]时缺少租户上下文
sys_auth_online_user 是租户表,不得加入全局忽略列表。
2. 修复范围
- 登录签发 Token 前,使用认证结果中的可信
LoginUser.tenantId 执行同账号旧会话查询和处理。
- 新增在线用户记录时,使用记录中的可信租户 ID 执行插入。
- Sa-Token 会话事件缺少请求上下文时,从 Token Session 或精确在线会话记录恢复租户,再执行状态更新。
- 修正主动登出原本调用
delete(updateWrapper) 的错误,改为更新离线状态并保留审计字段。
- 定时清理属于系统级全租户过期数据清理,显式使用
executeIgnore,不改变普通在线用户查询/管理的租户隔离。
3. 非目标
- 不修改租户严格模式。
- 不把
sys_auth_online_user 配成忽略租户表。
- 不修改登录协议、Token 格式、在线用户页面或数据库结构。
4. 验收标准
- 无请求租户上下文的登录流程可以查询旧会话并写入当前租户在线记录。
- 登出、顶号和续期事件在上下文缺失时只更新 Token 所属租户记录。
- 定时过期清理不再抛缺少租户上下文。
- 在线用户管理接口继续由租户拦截器隔离。
5. HARD-GATE
- 确认状态:已确认
- 确认依据:用户在本轮明确要求“先帮我解决”该异常。
- 确认范围:仅本 Spec 所列在线用户租户上下文修复与针对性测试。
6. 实施结论
- 登录签发、在线记录插入和 Sa-Token 事件已在最小数据库操作边界建立可信租户上下文,并在完成后恢复原上下文。
- 定时过期清理已显式声明为系统级跨租户操作;普通在线用户查询和管理仍保持租户隔离。
- 主动登出已由物理删除修正为更新离线状态和登出审计字段。
- 无需数据库迁移或配置变更。