liuyun b807cc7df8
Some checks are pending
CI / backend (push) Waiting to run
CI / frontend (push) Waiting to run
docs(spec): 归档 online-session-management + 同步 session 主 spec
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-11 21:38:24 +08:00

33 lines
2.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## Why
当前会话不可在线观测,唯一「踢下线」手段是重置密码(连带吊销全部会话);账号安全锁定仅有登录失败触发的临时 Redis 阈值,没有管理员可见、可操作的锁定/解锁闭环。安全审计要求会话可管理、锁定可处置,租户管理员也需要一个「在线会话」面板即时强退风险账号/设备。
## What Changes
- **会话标识**:JWT(access 与 refresh)引入会话标识 `sid`,使「单个会话精确强退」成为可能;「踢全部」复用现有 tokenVersion 机制。
- **在线会话域**(新增):列出活跃会话(用户 / 设备 IP / User-Agent / 登录时间 / 过期时间),支持按单个会话强退、按用户踢全部。
- **账号锁定**(独立字段):User 新增 `locked_at` / `lock_reason`,与 `status`(启用/停用)解耦;锁定账号在登录 / 刷新 / 鉴权处统一拒绝。
- **用户域锁定/解锁**:管理员可锁定(附原因,锁定即踢全部会话)与解锁(清空锁定并清除登录失败计数)。
- **前端**:新增「在线会话」页面(系统监控下);用户管理页新增「锁定/解锁」操作。
## Capabilities
### New Capabilities
- `backend/session`: 在线会话——活跃会话列表、单会话强退、按用户踢全部。
- `frontend/AD/session`: 在线会话管理页面——会话列表 + 强退按钮 + 用户维度踢全部。
### Modified Capabilities
- `backend/users`: 用户域新增「锁定/解锁」与「踢全部会话」行为。
- `frontend/AD/user`: 用户管理页新增「锁定/解锁」操作。
- `shared/data-model`: `user` 实体新增 `locked_at` / `lock_reason` 字段;用户状态机改为「启用/停用」+ 独立「锁定」标志。
- `shared/api-contract`: 核心域接口目录新增 `/sessions`;用户域新增锁定/解锁/踢全部会话接口。
## Impact
- **后端**:`auth`(`issue` 加 `sid`、JwtAuthGuard 校验 sid 存活、登录拒绝锁定)、`users`(lock/unlock/kick-all)、新增 `sessions` 模块;Prisma(`User` 加列);`tenant-template`(新增会话菜单/接口资源 + 用户锁定/解锁/踢全部接口资源 + 按钮)。
- **前端**:新增 `session` 页面、`user` 页锁定/解锁操作、`api/session.ts` 与 `api/user.ts` 扩展。
- **数据**:Prisma migration(`sys_user` 加 `locked_at` / `lock_reason`)。
- **Redis**:新增会话吊销黑名单 key(`sessionRevoked:{sid}`,TTL = access token 剩余时长)。