feat: harden sessions and track downstream acknowledgements

This commit is contained in:
hectorzhao
2026-07-14 14:18:43 +08:00
parent 3d37adcc9f
commit 8c03663f24
43 changed files with 1733 additions and 150 deletions
+15
View File
@@ -3251,6 +3251,12 @@ npm run verify:phase8
| TC-AUTH-004 | 使用平台管理员或未关联企业的用户登录 `/client/login`。 | 登录失败;不进入客户端。 |
| TC-AUTH-005 | 同一用户连续输错密码 5 次。 | 第 5 次后用户锁定 24 小时;锁定期内正确密码也被拒绝;系统记录失败次数和锁定时间。 |
| TC-AUTH-006 | 输入错误或过期图形验证码登录。 | 返回 400 可读错误;必须刷新验证码后重试。 |
| TC-AUTH-007 | 使用运营管理员登录,确认响应、浏览器存储和 Redis;不携带 Cookie 访问运营 API。 | 登录响应和 localStorage 不含访问令牌;浏览器仅持有 HttpOnly 会话 CookieRedis 存在哈希会话记录;无 Cookie 请求返回 `401/SESSION_INVALID`。 |
| TC-AUTH-008 | 将运营端无操作参数缩短后等待超时,同时保持 Dashboard 自动轮询;再输入当前密码解锁。 | 自动轮询不续期;服务端返回 `401/SESSION_LOCKED`;页面锁屏但无需账号和验证码;当前密码正确时轮换 Session ID,旧标识失效,多标签同步解锁。 |
| TC-AUTH-009 | 将客户端无操作参数缩短并验证其阈值独立于运营端;锁定后超过锁定恢复期限。 | 客户端使用独立 120 分钟默认阈值;超过 4 小时恢复期限后密码快速解锁被拒绝,必须完整登录。 |
| TC-AUTH-010 | 持续操作至绝对期限,将默认 12 小时在测试环境缩短验证。 | 用户活动只能刷新空闲时间,不能延长绝对期限;到期返回 `401/SESSION_ABSOLUTE_TIMEOUT`,必须重新输入账号、密码和验证码。 |
| TC-AUTH-011 | 登录超过最近认证窗口后执行用户禁用、手工充值、通道修改、路由修改或报备状态修改。 | 后端先返回 `403/RECENT_AUTHENTICATION_REQUIRED`,输入当前密码后 30 分钟内自动重试;错误密码不执行原操作,数据库无副作用。 |
| TC-AUTH-012 | 分别执行主动退出、修改密码、禁用、删除和角色变更,并在另一标签页继续请求。 | Redis 会话删除或 `sessionVersion` 失效;所有标签页同步退出;旧 Cookie 均返回 401;系统日志可查询创建、锁定、解锁、再认证和退出事件。 |
| TC-USER-ADMIN-001 | 运营端新增平台管理员,填写用户名/登录账号、邮箱或手机号、初始密码。 | 创建成功;用户无 `tenantId`;可登录运营端;写 `user.created` 日志。 |
| TC-USER-ADMIN-002 | 运营端新增企业管理员但不选择企业。 | 返回 400;不创建用户。 |
| TC-USER-ADMIN-003 | 运营端新增企业管理员并选择企业。 | 创建成功;用户关联企业;可登录客户端;客户端数据按该企业隔离。 |
@@ -3276,3 +3282,12 @@ npm run verify:phase8
| TC-MOCK-CLEAN-006 | 运营端短信记录按手机号、状态、日期和内容查询,打开详情。 | 数据来自 `sms_message_records`;详情展示真实 messageId、状态、失败原因;无数据时为空态。 |
| TC-MOCK-CLEAN-007 | 访问明确标注待开发的彩信菜单。 | 可以显示待开发/空态;不得作为第一版短信真实功能通过依据。 |
| TC-PHONE-SEGMENT-001 | 生产库存在 50 万级手机号段时打开手机号段库,连续点击下一页、上一页,并按号段、省份、城市或运营商搜索。 | API 使用 `prefix` 游标分页并返回 `hasMore/nextCursor`;页面数据来自真实数据库,可稳定前后翻页和搜索;接口不执行全表总数统计,页面不展示号段总条数。 |
### 17.11 下游投递 ACK 与应用级重试策略
| 用例编号 | 操作 | 预期结果 |
| --- | --- | --- |
| TC-GW-ACK-001 | 客户在线时分别触发一条状态回执和一条上行短信,Gateway `SendPkt` 成功后延迟返回 `CMPP_DELIVER_RESP`。 | 写出后 `CmppDownstreamDelivery.status=awaiting_ack`;只有匹配连接、Sequence_Id、Msg_Id 且 Result=0 后才变为 `delivered`,并保存写出时间、确认时间、ACK 字段和连接 ID。 |
| TC-GW-ACK-002 | 分别返回非零 Result、不返回响应直到超时、重启 Gateway 后让旧 `awaiting_ack` 超时。 | 非零 Result 和超时不会误记为 deliveredGateway 重启后 NestJS 能恢复过期 ACK,按策略进入退避重试或最终 `rejected/unconfirmed`。 |
| TC-GW-ACK-003 | 在企业应用中分别关闭“回执自动重试”和“上行短信自动重试”,各制造一次 ACK 超时,再重新开启并创建新投递。 | 关闭只影响对应类型的新投递策略快照;离线后的首次投递仍会在重连时执行;已写出未确认的记录不自动重发;重新开启后新记录按退避策略重试。 |
| TC-GW-ACK-004 | 对 `unconfirmed/rejected/failed` 记录执行单条和批量手工重投。 | 页面提示重复处理风险并二次确认;真实调用 Gateway;`awaiting_ack/delivered` 不允许重投;重发复用同一业务 Msg_Id。 |