报告日期: 2026-04-19
测试范围: API (go-zero REST, 全 POST) + gRPC (status codes) + Model 层 (_gen.go 模板生成 + 自定义方法) + Logic 单元测试 + util 层 + 访问控制 + UserDetailsLoader + 限流中间件 + 审计修复回归
测试用例设计详见 test-design.md
执行命令:go test -count=1 -timeout 600s -cover ./...
覆盖率命令:go test -count=1 -coverprofile=/tmp/cover.out ./... && go tool cover -func=/tmp/cover.out
| 指标 | 数值 |
|---|---|
| 测试包总数 (可运行) | 23 |
| TC 用例总数 (test-design.md) | 604 (原 586 + 本轮 H-A/H-B/M-B/M-C/L-B/L-C/L-F 回归 18) |
| 顶层 Test 函数总数 | 759 |
子用例 (t.Run) 数量 |
87 |
| 测试执行事件总数 (含子用例) | 846 |
| ✅ 通过 | 845 |
| ❌ 失败 | 0 |
| ⏭️ 跳过 | 1 (TC-0263 防御性不可达分支) |
整体语句覆盖率 (go test -cover ./...) |
57.8% (含 handler / pb / permclient / testutil 等生成或桩代码) |
| 业务代码函数平均覆盖率 | ≈ 87.8% (剔除 handler / svc / pb / permclient / testutil / config) |
| 通过率 (TC 维度) | 99.83% |
| 审计修复回归通过率 | 100% (累计 34/34,本轮 18/18) |
| 测试包 | 状态 | 耗时 | 语句覆盖率 | 顶层 Test 函数数 |
|---|---|---|---|---|
| handler/pub | ✅ ok | 0.820s | 25.0% | 2 |
| loaders | ✅ ok | 1.924s | 84.4% | 23 |
| logic/auth | ✅ ok | 6.629s | 78.6% | 49 |
| logic/dept | ✅ ok | 2.939s | 90.3% | 28 |
| logic/member | ✅ ok | 3.721s | 84.4% | 24 |
| logic/perm | ✅ ok | 4.352s | 78.6% | 4 |
| logic/product | ✅ ok | 5.849s | 84.0% | 26 |
| logic/pub | ✅ ok | 6.174s | 90.3% | 51 |
| logic/role | ✅ ok | 4.947s | 83.2% | 27 |
| logic/user | ✅ ok | 8.765s | 88.1% | 95 |
| middleware | ✅ ok | 6.416s | 80.3% | 17 |
| model/dept | ✅ ok | 7.222s | 83.4% | 32 |
| model/perm | ✅ ok | 8.098s | 93.2% | 47 |
| model/product | ✅ ok | 8.796s | 93.5% | 28 |
| model/productmember | ✅ ok | 9.570s | 88.4% | 38 |
| model/role | ✅ ok | 10.252s | 95.1% | 50 |
| model/roleperm | ✅ ok | 10.117s | 87.1% | 39 |
| model/user | ✅ ok | 11.277s | 87.7% | 54 |
| model/userperm | ✅ ok | 10.255s | 93.3% | 36 |
| model/userrole | ✅ ok | 9.426s | 90.7% | 39 |
| response | ✅ ok | 9.262s | 94.7% | 8 |
| server | ✅ ok | 10.249s | 74.2% | 28 |
| util | ✅ ok | 9.610s | 40.9% | 3 |
./... 所有包(包含 handler/svc/pb/permclient/testutil/mocks 等非业务包)的合并语句覆盖率.handler/* 为 go-zero 代码生成的薄路由层, 其逻辑在 logic 层已被单测/集成测试覆盖, 本次未对 handler 入口再写重复用例, 故 handler 语句覆盖率偏低(除 handler/pub 登录/管理后台登录 HTTP 入口被 loginHandler_test.go / adminLoginHandler_test.go 直接覆盖外).util 包覆盖率 40.9% 因 util 包内存在大量 string/path 辅助函数未在生产代码使用, 仅 NormalizePage / IsValidEmail / IsValidPhone 等对外暴露方法被测试覆盖.846 次测试执行事件中, 845 通过, 1 跳过, 0 失败, 未发现 BUG. (model/perm.TestSysPermModel_BatchInsert_Bulk1000 在与 ./... 全量并行时偶发与其他包对同一测试 DB 的清理争用而失败,但独立重跑与 -cover ./... 串行跑均稳定通过,判定为测试基础设施层 flaky, 非产品缺陷)下表按
test-design.md的章节顺序枚举每一个 TC 的编号、测试场景与执行结果.
POST /api/auth/login| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0001 | POST /api/auth/login - 正常登录(普通用户+productCode) | ✅ pass |
| TC-0002 | POST /api/auth/login - 正常登录-带productCode+ADMIN成员 | ✅ pass |
| TC-0003 | POST /api/auth/login - 超管通过产品端登录被拒绝 | ✅ pass |
| TC-0004 | POST /api/auth/login - 超管无productCode被拒绝 | ✅ pass |
| TC-0005 | POST /api/auth/login - 用户不存在 | ✅ pass |
| TC-0006 | POST /api/auth/login - DB异常(非ErrNotFound) | ✅ pass |
| TC-0007 | POST /api/auth/login - 密码错误 | ✅ pass |
| TC-0008 | POST /api/auth/login - 账号冻结 | ✅ pass |
| TC-0009 | POST /api/auth/login - 非产品成员 | ✅ pass |
| TC-0010 | POST /api/auth/login - DEVELOPER成员 | ✅ pass |
| TC-0011 | POST /api/auth/login - SQL注入 | ✅ pass |
| TC-0012 | POST /api/auth/login - 缺少必填字段 | ✅ pass |
| TC-0013 | POST /api/auth/login - 产品成员被禁用时拒绝登录 | ✅ pass |
| TC-0014 | POST /api/auth/login - 产品被禁用时拒绝登录 | ✅ pass |
POST /api/auth/adminLogin| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0015 | POST /api/auth/adminLogin - 超管正常登录 | ✅ pass |
| TC-0016 | POST /api/auth/adminLogin - 普通用户被拒绝 | ✅ pass |
| TC-0017 | POST /api/auth/adminLogin - managementKey无效 | ✅ pass |
| TC-0018 | POST /api/auth/adminLogin - managementKey为空 | ✅ pass |
| TC-0019 | POST /api/auth/adminLogin - 用户不存在 | ✅ pass |
| TC-0020 | POST /api/auth/adminLogin - 密码错误 | ✅ pass |
| TC-0021 | POST /api/auth/adminLogin - 账号冻结 | ✅ pass |
| TC-0022 | POST /api/auth/adminLogin - 不带productCode时perms为空 | ✅ pass |
| TC-0023 | POST /api/auth/adminLogin - 缺少必填字段 | ✅ pass |
| TC-0024 | POST /api/auth/adminLogin - SQL注入username | ✅ pass |
| TC-0025 | POST /api/auth/adminLogin - adminLogin 用户名限流 | ✅ pass |
POST /api/auth/refreshToken| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0026 | POST /api/auth/refreshToken - 正常刷新 | ✅ pass |
| TC-0027 | POST /api/auth/refreshToken - 不带productCode(回退) | ✅ pass |
| TC-0028 | POST /api/auth/refreshToken - token无效 | ✅ pass |
| TC-0029 | POST /api/auth/refreshToken - 用户已删除 | ✅ pass |
| TC-0030 | POST /api/auth/refreshToken - 账号冻结 | ✅ pass |
| TC-0031 | POST /api/auth/refreshToken - 超管+productCode(token中已含相同pc) | ✅ pass |
| TC-0032 | POST /api/auth/refreshToken - 尝试切换产品被拒绝 | ✅ pass |
| TC-0033 | POST /api/auth/refreshToken - TokenVersion不匹配时拒绝刷新 | ✅ pass |
| TC-0034 | POST /api/auth/refreshToken - 使用accessToken作为refreshToken被拒绝 | ✅ pass |
| TC-0035 | POST /api/auth/refreshToken - 产品成员已移除时拒绝刷新 | ✅ pass |
POST /api/perm/sync| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0036 | POST /api/perm/sync - 全部新增 | ✅ pass |
| TC-0037 | POST /api/perm/sync - 更新已有(名称变更) | ✅ pass |
| TC-0038 | POST /api/perm/sync - 无变化 | ✅ pass |
| TC-0039 | POST /api/perm/sync - 禁用权限重启 | ✅ pass |
| TC-0040 | POST /api/perm/sync - 移除不在列表的权限 | ✅ pass |
| TC-0041 | POST /api/perm/sync - 空perms数组被拒绝 | ✅ pass |
| TC-0042 | POST /api/perm/sync - 验证disabled返回值 | ✅ pass |
| TC-0043 | POST /api/perm/sync - appKey无效 | ✅ pass |
| TC-0044 | POST /api/perm/sync - appSecret错误 | ✅ pass |
| TC-0045 | POST /api/perm/sync - 产品已禁用 | ✅ pass |
| TC-0046 | POST /api/perm/sync - 大批量(1000条) | ✅ pass |
| TC-0047 | POST /api/perm/sync - 重复code去重 | ✅ pass |
| TC-0048 | POST /api/perm/sync - 事务保护-中途失败回滚 | ✅ pass |
POST /api/auth/userInfo| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0049 | POST /api/auth/userInfo - 正常获取-含productCode | ✅ pass |
| TC-0050 | POST /api/auth/userInfo - 不含productCode | ✅ pass |
| TC-0051 | POST /api/auth/userInfo - 未登录 | ✅ pass |
| TC-0052 | POST /api/auth/userInfo - token过期 | ✅ pass |
| TC-0053 | POST /api/auth/userInfo - userId=0 | ✅ pass |
POST /api/auth/changePassword| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0054 | POST /api/auth/changePassword - 正常修改 | ✅ pass |
| TC-0055 | POST /api/auth/changePassword - mustChangePassword重置 | ✅ pass |
| TC-0056 | POST /api/auth/changePassword - 原密码错误 | ✅ pass |
| TC-0057 | POST /api/auth/changePassword - 新密码少于8字符 | ✅ pass |
| TC-0058 | POST /api/auth/changePassword - 新密码恰好8字符(含大小写+数字) | ✅ pass |
| TC-0059 | POST /api/auth/changePassword - 新密码空字符串 | ✅ pass |
| TC-0060 | POST /api/auth/changePassword - 新密码超过72字符 | ✅ pass |
| TC-0061 | POST /api/auth/changePassword - 新密码恰好72字符 | ✅ pass |
| TC-0062 | POST /api/auth/changePassword - 新旧密码相同 | ✅ pass |
| TC-0063 | POST /api/auth/changePassword - 用户不存在 | ✅ pass |
POST /api/product/create| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0064 | POST /api/product/create - 正常创建 | ✅ pass |
| TC-0065 | POST /api/product/create - 事务回滚-用户创建失败 | ✅ pass |
| TC-0066 | POST /api/product/create - 事务回滚-成员创建失败 | ✅ pass |
| TC-0067 | POST /api/product/create - 编码已存在 | ✅ pass |
| TC-0068 | POST /api/product/create - 并发创建同编码 | ✅ pass |
| TC-0069 | POST /api/product/create - createProduct 含空格被拒绝 | ✅ pass |
| TC-0070 | POST /api/product/create - createProduct 含特殊字符被拒绝 | ✅ pass |
| TC-0071 | POST /api/product/create - createProduct 全中文被拒绝 | ✅ pass |
| TC-0072 | POST /api/product/create - createProduct 纯数字开头被拒绝 | ✅ pass |
| TC-0073 | POST /api/product/create - createProduct 空字符串被拒绝 | ✅ pass |
| TC-0074 | POST /api/product/create - createProduct 长度>64 被拒绝 | ✅ pass |
| TC-0075 | POST /api/product/create - createProduct 合法编码(含下划线/中划线/数字) | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0076 | POST /api/product/update - 正常更新 | ✅ pass |
| TC-0077 | POST /api/product/update - 不存在 | ✅ pass |
| TC-0078 | POST /api/product/update - 不传status | ✅ pass |
| TC-0079 | POST /api/product/list - 正常分页 | ✅ pass |
| TC-0080 | POST /api/product/list - 默认分页 | ✅ pass |
| TC-0081 | POST /api/product/list - pageSize超过上限 | ✅ pass |
| TC-0082 | POST /api/product/list - pageSize=0 | ✅ pass |
| TC-0083 | POST /api/product/list - page负值 | ✅ pass |
| TC-0084 | POST /api/product/detail - 正常查询 | ✅ pass |
| TC-0085 | POST /api/product/detail - 不存在 | ✅ pass |
| TC-0086 | POST /api/product/list - 非超管AppKey隐藏 | ✅ pass |
| TC-0087 | POST /api/product/list - 超管可见AppKey | ✅ pass |
| TC-0088 | POST /api/product/detail - 非超管AppKey隐藏 | ✅ pass |
| TC-0089 | POST /api/product/detail - 超管可见AppKey | ✅ pass |
| TC-0090 | POST /api/product/update - updateProduct 非法状态值被拒绝 | ✅ pass |
POST /api/dept/create| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0091 | POST /api/dept/create - 创建顶级部门 | ✅ pass |
| TC-0092 | POST /api/dept/create - 创建子部门 | ✅ pass |
| TC-0093 | POST /api/dept/create - 父部门不存在 | ✅ pass |
| TC-0094 | POST /api/dept/create - 不传DeptType默认NORMAL | ✅ pass |
| TC-0095 | POST /api/dept/create - 传DeptType=DEV | ✅ pass |
| TC-0096 | POST /api/dept/create - 事务内FindOneWithTx可见性 | ✅ pass |
| TC-0097 | POST /api/dept/create - 事务回滚-Insert失败 | ✅ pass |
| TC-0098 | POST /api/dept/create - 事务回滚-UpdateWithTx失败 | ✅ pass |
| TC-0099 | POST /api/dept/create - 多层嵌套(5层) | ✅ pass |
| TC-0100 | POST /api/dept/create - 通过Logic创建+验证Path | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0101 | POST /api/dept/update - 正常更新 | ✅ pass |
| TC-0102 | POST /api/dept/update - 不存在 | ✅ pass |
| TC-0103 | POST /api/dept/update - DeptType NORMAL→DEV | ✅ pass |
| TC-0104 | POST /api/dept/update - DeptType无效值返回错误 | ✅ pass |
| TC-0105 | POST /api/dept/update - DeptType变更时级联清除子部门用户缓存 | ✅ pass |
| TC-0106 | POST /api/dept/delete - 正常删除(无子部门) | ✅ pass |
| TC-0107 | POST /api/dept/delete - 有子部门 | ✅ pass |
| TC-0108 | POST /api/dept/delete - 不存在的部门 | ✅ pass |
| TC-0109 | POST /api/dept/delete - 部门下有关联用户 | ✅ pass |
| TC-0110 | POST /api/dept/tree - 正常获取 | ✅ pass |
| TC-0111 | POST /api/dept/tree - 空数据 | ✅ pass |
| TC-0112 | POST /api/dept/tree - 孤儿节点 | ✅ pass |
POST /api/perm/list| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0113 | POST /api/perm/list - 正常查询 | ✅ pass |
| TC-0114 | POST /api/perm/list - 默认分页 | ✅ pass |
| TC-0115 | POST /api/perm/list - pageSize超过上限 | ✅ pass |
| TC-0116 | POST /api/perm/list - 不存在的productCode | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0117 | POST /api/role/create - 正常创建 | ✅ pass |
| TC-0118 | POST /api/role/create - 重复角色名 | ✅ pass |
| TC-0119 | POST /api/role/create - 并发同名创建 | ✅ pass |
| TC-0120 | POST /api/role/update - 正常更新 | ✅ pass |
| TC-0121 | POST /api/role/update - 不存在 | ✅ pass |
| TC-0122 | POST /api/role/list - 正常查询 | ✅ pass |
| TC-0123 | POST /api/role/list - pageSize超过上限 | ✅ pass |
| TC-0124 | POST /api/role/detail - 正常查询 | ✅ pass |
| TC-0125 | POST /api/role/detail - 不存在 | ✅ pass |
POST /api/role/delete| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0126 | POST /api/role/delete - 正常删除+级联 | ✅ pass |
| TC-0127 | POST /api/role/delete - 事务回滚 | ✅ pass |
| TC-0128 | POST /api/role/delete - 无关联数据 | ✅ pass |
POST /api/role/bindPerms| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0129 | POST /api/role/bindPerms - 正常绑定 | ✅ pass |
| TC-0130 | POST /api/role/bindPerms - 角色不存在 | ✅ pass |
| TC-0131 | POST /api/role/bindPerms - 清空权限 | ✅ pass |
| TC-0132 | POST /api/role/bindPerms - 重复permId | ✅ pass |
| TC-0133 | POST /api/role/bindPerms - 事务回滚 | ✅ pass |
POST /api/user/create| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0134 | POST /api/user/create - 正常创建 | ✅ pass |
| TC-0135 | POST /api/user/create - 用户名已存在(预检) | ✅ pass |
| TC-0136 | POST /api/user/create - 带完整可选字段 | ✅ pass |
| TC-0137 | POST /api/user/create - 非法email格式 | ✅ pass |
| TC-0138 | POST /api/user/create - 合法email | ✅ pass |
| TC-0139 | POST /api/user/create - email为空(可选) | ✅ pass |
| TC-0140 | POST /api/user/create - 非法phone格式 | ✅ pass |
| TC-0141 | POST /api/user/create - 合法phone(国际) | ✅ pass |
| TC-0142 | POST /api/user/create - phone为空(可选) | ✅ pass |
| TC-0143 | POST /api/user/create - 并发同username(TOCTOU) | ✅ pass |
| TC-0144 | POST /api/user/create - 唯一索引冲突消息 | ✅ pass |
| TC-0145 | POST /api/user/create - 密码少于8字符 | ✅ pass |
| TC-0146 | POST /api/user/create - 密码缺少大写字母 | ✅ pass |
| TC-0147 | POST /api/user/create - 密码缺少小写字母 | ✅ pass |
| TC-0148 | POST /api/user/create - 密码缺少数字 | ✅ pass |
| TC-0149 | POST /api/user/create - 密码超过72字符 | ✅ pass |
| TC-0150 | POST /api/user/create - 用户名含特殊字符被拒绝 | ✅ pass |
| TC-0151 | POST /api/user/create - 用户名太短(1字符)被拒绝 | ✅ pass |
| TC-0152 | POST /api/user/create - 用户名太长(65字符)被拒绝 | ✅ pass |
| TC-0153 | POST /api/user/create - 部门不存在被拒绝 | ✅ pass |
| TC-0154 | POST /api/user/create - 昵称超过64字符被拒绝 | ✅ pass |
| TC-0155 | POST /api/user/create - 备注超过255字符被拒绝 | ✅ pass |
POST /api/user/update (指针类型+DeptId可清零)| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0156 | POST /api/user/update - 正常更新 | ✅ pass |
| TC-0157 | POST /api/user/update - 不存在 | ✅ pass |
| TC-0158 | POST /api/user/update - 仅传id | ✅ pass |
| TC-0159 | POST /api/user/update - 清空nickname | ✅ pass |
| TC-0160 | POST /api/user/update - 清空email | ✅ pass |
| TC-0161 | POST /api/user/update - 清空remark | ✅ pass |
| TC-0162 | POST /api/user/update - 非法email格式 | ✅ pass |
| TC-0163 | POST /api/user/update - 非法phone格式 | ✅ pass |
| TC-0164 | POST /api/user/update - 合法phone | ✅ pass |
| TC-0165 | POST /api/user/update - 不传email(nil) | ✅ pass |
| TC-0166 | POST /api/user/update - DeptId设为0(取消部门) | ✅ pass |
| TC-0167 | POST /api/user/update - DeptId设为正值 | ✅ pass |
| TC-0168 | POST /api/user/update - DeptId不传(nil) | ✅ pass |
| TC-0169 | POST /api/user/update - 超管不能冻结另一超管 | ✅ pass |
| TC-0170 | POST /api/user/update - updateUser-产品管理员可管理范围内用户 | ✅ pass |
| TC-0171 | POST /api/user/update - updateUser-昵称超长拒绝 | ✅ pass |
| TC-0172 | POST /api/user/update - updateUser-部门不存在 | ✅ pass |
| TC-0173 | POST /api/user/update - updateUser 修改状态时递增 tokenVersion | ✅ pass |
| TC-0174 | POST /api/user/update - updateUser 仅改 profile 不递增 tokenVersion | ✅ pass |
| TC-0175 | POST /api/user/update - updateUser 乐观锁冲突 -> 409 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0176 | POST /api/user/list - 含productCode | ✅ pass |
| TC-0177 | POST /api/user/list - 不含productCode | ✅ pass |
| TC-0178 | POST /api/user/list - pageSize超过上限 | ✅ pass |
| TC-0179 | POST /api/user/list - 用户不在产品中 | ✅ pass |
| TC-0180 | POST /api/user/list - 批量查询DB异常 | ✅ pass |
| TC-0181 | POST /api/user/detail - 正常查询 | ✅ pass |
| TC-0182 | POST /api/user/detail - 正常查询-含Avatar | ✅ pass |
| TC-0183 | POST /api/user/detail - 不存在 | ✅ pass |
| TC-0184 | POST /api/user/bindRoles - 正常绑定 | ✅ pass |
| TC-0185 | POST /api/user/bindRoles - 用户不存在 | ✅ pass |
| TC-0186 | POST /api/user/bindRoles - 清空角色 | ✅ pass |
| TC-0187 | POST /api/user/bindRoles - 事务回滚 | ✅ pass |
| TC-0188 | POST /api/user/bindRoles - 角色不属于当前产品 | ✅ pass |
| TC-0189 | POST /api/user/bindRoles - 角色已禁用 | ✅ pass |
| TC-0190 | POST /api/user/bindRoles - 角色不存在 | ✅ pass |
| TC-0191 | POST /api/user/bindRoles - 非产品成员绑定角色被拒绝 | ✅ pass |
| TC-0192 | POST /api/user/setPerms - 正常ALLOW | ✅ pass |
| TC-0193 | POST /api/user/setPerms - 用户不存在 | ✅ pass |
| TC-0194 | POST /api/user/setPerms - DENY权限 | ✅ pass |
| TC-0195 | POST /api/user/setPerms - 清空权限 | ✅ pass |
| TC-0196 | POST /api/user/setPerms - 无效Effect值 | ✅ pass |
| TC-0197 | POST /api/user/setPerms - PermId不存在 | ✅ pass |
| TC-0198 | POST /api/user/setPerms - 权限不属于当前产品 | ✅ pass |
| TC-0199 | POST /api/user/setPerms - 非产品成员设置权限被拒绝 | ✅ pass |
| TC-0200 | POST /api/user/updateStatus - 正常冻结 | ✅ pass |
| TC-0201 | POST /api/user/updateStatus - 正常解冻 | ✅ pass |
| TC-0202 | POST /api/user/updateStatus - 非法status(0) | ✅ pass |
| TC-0203 | POST /api/user/updateStatus - 冻结自己 | ✅ pass |
| TC-0204 | POST /api/user/updateStatus - 冻结超管 | ✅ pass |
| TC-0205 | POST /api/user/list - userList-非超管仅可见产品成员 | ✅ pass |
| TC-0206 | POST /api/user/list - userList-非超管未指定productCode被拒绝 | ✅ pass |
| TC-0207 | POST /api/user/list - userList-非超管使用错误productCode被拒绝 | ✅ pass |
| TC-0208 | POST /api/user/bindRoles - bindRoles-permsLevel越权拒绝 | ✅ pass |
| TC-0209 | POST /api/user/bindRoles - bindRoles-超管可分配任意级别角色 | ✅ pass |
| TC-0210 | POST /api/user/setPerms - 同一权限ID冲突Effect被拒绝 | ✅ pass |
| TC-0211 | POST /api/user/setPerms - 重复权限ID相同Effect去重 | ✅ pass |
| TC-0212 | POST /api/user/setPerms - 已禁用权限不能被设置 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0213 | POST /api/member/add - 正常添加 | ✅ pass |
| TC-0214 | POST /api/member/add - 产品不存在 | ✅ pass |
| TC-0215 | POST /api/member/add - 用户不存在 | ✅ pass |
| TC-0216 | POST /api/member/add - 已是成员 | ✅ pass |
| TC-0217 | POST /api/member/add - 并发添加 | ✅ pass |
| TC-0218 | POST /api/member/add - 无效MemberType | ✅ pass |
| TC-0219 | POST /api/member/update - 正常更新 | ✅ pass |
| TC-0220 | POST /api/member/update - 不存在 | ✅ pass |
| TC-0221 | POST /api/member/update - 无效MemberType | ✅ pass |
| TC-0222 | POST /api/member/list - 正常查询(批量查用户) | ✅ pass |
| TC-0223 | POST /api/member/list - 成员用户已删除 | ✅ pass |
| TC-0224 | POST /api/member/list - pageSize超过上限 | ✅ pass |
| TC-0225 | POST /api/member/list - 空成员列表 | ✅ pass |
| TC-0226 | POST /api/member/remove - 正常移除+级联(事务内) | ✅ pass |
| TC-0227 | POST /api/member/remove - 跨产品隔离 | ✅ pass |
| TC-0228 | POST /api/member/remove - 成员不存在 | ✅ pass |
| TC-0229 | POST /api/member/remove - 事务回滚 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0230 | SyncPermissions - 正常同步 | ✅ pass |
| TC-0231 | SyncPermissions - appKey无效 | ✅ pass |
| TC-0232 | SyncPermissions - appSecret错误 | ✅ pass |
| TC-0233 | SyncPermissions - 产品已禁用 | ✅ pass |
| TC-0234 | SyncPermissions - 验证disabled计数 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0235 | Login - 正常登录(普通用户+productCode) | ✅ pass |
| TC-0236 | Login - 用户不存在 | ✅ pass |
| TC-0237 | Login - 密码错误 | ✅ pass |
| TC-0238 | Login - 账号冻结 | ✅ pass |
| TC-0239 | Login - 超管被拒绝 | ✅ pass |
| TC-0240 | Login - 普通用户+productCode | ✅ pass |
| TC-0241 | Login - 产品成员被禁用时拒绝登录 | ✅ pass |
| TC-0242 | Login - productCode为空 | ✅ pass |
| TC-0243 | RefreshToken - 正常刷新 | ✅ pass |
| TC-0244 | RefreshToken - token无效 | ✅ pass |
| TC-0245 | RefreshToken - 账号冻结 | ✅ pass |
| TC-0246 | RefreshToken - productCode回退到claims | ✅ pass |
| TC-0247 | RefreshToken - 超管+productCode | ✅ pass |
| TC-0248 | RefreshToken - 普通用户+productCode | ✅ pass |
| TC-0249 | VerifyToken - 有效token | ✅ pass |
| TC-0250 | VerifyToken - 无效token | ✅ pass |
| TC-0251 | VerifyToken - 缺少userId | ✅ pass |
| TC-0252 | VerifyToken - 冻结用户token返回Invalid | ✅ pass |
| TC-0253 | VerifyToken - 非成员token返回Invalid | ✅ pass |
| TC-0254 | VerifyToken - 返回实时MemberType和Perms | ✅ pass |
| TC-0255 | GetUserPerms - 用户不存在(需先通过AppKey/Secret认证) | ✅ pass |
| TC-0256 | GetUserPerms - 超管(需先通过AppKey/Secret认证) | ✅ pass |
| TC-0257 | GetUserPerms - MEMBER-DENY覆盖(需先通过AppKey/Secret认证) | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0258 | 正常Bearer token | ✅ pass |
| TC-0259 | 无Authorization头 | ✅ pass |
| TC-0260 | 无Bearer前缀 | ✅ pass |
| TC-0261 | token签名错误 | ✅ pass |
| TC-0262 | token过期 | ✅ pass |
| TC-0263 | claims类型断言失败 | ⏭️ skip |
| TC-0264 | refresh token被拒绝 | ✅ pass |
| TC-0265 | 业务错误(CodeError) | ✅ pass |
| TC-0266 | 内部错误 | ✅ pass |
| TC-0267 | 成功(有data) | ✅ pass |
| TC-0268 | 成功(无data) | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0269 | 正常值 | ✅ pass |
| TC-0270 | page<=0 | ✅ pass |
| TC-0271 | page=-1 | ✅ pass |
| TC-0272 | pageSize<=0 | ✅ pass |
| TC-0273 | pageSize>100 | ✅ pass |
| TC-0274 | pageSize=100 | ✅ pass |
| TC-0275 | pageSize=101 | ✅ pass |
| TC-0276 | 双零 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0277 | 正常邮箱 | ✅ pass |
| TC-0278 | 含点号 | ✅ pass |
| TC-0279 | 含加号 | ✅ pass |
| TC-0280 | 缺少@ | ✅ pass |
| TC-0281 | 缺少域名 | ✅ pass |
| TC-0282 | 缺少TLD | ✅ pass |
| TC-0283 | 空字符串 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0284 | 国内手机号 | ✅ pass |
| TC-0285 | 带+国际码 | ✅ pass |
| TC-0286 | 太短(6位) | ✅ pass |
| TC-0287 | 恰好7位 | ✅ pass |
| TC-0288 | 最长15位 | ✅ pass |
| TC-0289 | 超长16位 | ✅ pass |
| TC-0290 | 包含字母 | ✅ pass |
| TC-0291 | 空字符串 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0292 | 正常生成 | ✅ pass |
| TC-0293 | 解析token验证claims | ✅ pass |
| TC-0294 | 空secret | ✅ pass |
| TC-0295 | 空perms | ✅ pass |
| TC-0296 | 过期时间验证 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0297 | 正常生成 | ✅ pass |
| TC-0298 | 解析验证 | ✅ pass |
| TC-0299 | productCode为空 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0300 | 正常解析 | ✅ pass |
| TC-0301 | 错误secret | ✅ pass |
| TC-0302 | 无效token字符串 | ✅ pass |
| TC-0303 | 空token | ✅ pass |
| TC-0304 | 过期token | ✅ pass |
| TC-0305 | AccessToken误用 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0306 | GetUserId-正常 | ✅ pass |
| TC-0307 | GetUserId-空ctx | ✅ pass |
| TC-0308 | GetProductCode-正常 | ✅ pass |
| TC-0309 | GetUserDetails 返回完整字段 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0310 | Insert - 正常插入 | ✅ pass |
| TC-0311 | Insert - 正常插入含TokenVersion | ✅ pass |
| TC-0312 | Insert - 唯一索引冲突 | ✅ pass |
| TC-0313 | Insert - 缓存key生成正确 | ✅ pass |
| TC-0314 | InsertWithTx - 事务内插入 | ✅ pass |
| TC-0315 | InsertWithTx - 事务内插入含TokenVersion | ✅ pass |
| TC-0316 | InsertWithTx - 事务回滚后无数据 | ✅ pass |
| TC-0317 | FindOne - 正常查询(缓存未命中) | ✅ pass |
| TC-0318 | FindOne - 正常查询(缓存命中) | ✅ pass |
| TC-0319 | FindOne - 记录不存在 | ✅ pass |
| TC-0320 | FindOne - DB异常(非ErrNotFound) | ✅ pass |
| TC-0321 | FindOneWithTx - 事务内正常查询 | ✅ pass |
| TC-0322 | FindOneWithTx - 事务内记录不存在 | ✅ pass |
| TC-0323 | FindOneWithTx - 事务内可见性 | ✅ pass |
| TC-0324 | Update - 正常更新 | ✅ pass |
| TC-0325 | Update - 正常更新含TokenVersion | ✅ pass |
| TC-0326 | Update - 记录不存在 | ✅ pass |
| TC-0327 | UpdateWithTx - 事务内更新 | ✅ pass |
| TC-0328 | Delete - 正常删除 | ✅ pass |
| TC-0329 | Delete - 记录不存在 | ✅ pass |
| TC-0330 | DeleteWithTx - 事务内删除 | ✅ pass |
| TC-0331 | TransactCtx - 正常事务 | ✅ pass |
| TC-0332 | TransactCtx - fn返回错误 | ✅ pass |
| TC-0333 | TableName - 获取表名 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0334 | BatchInsert - 空列表 | ✅ pass |
| TC-0335 | BatchInsert - 单条记录 | ✅ pass |
| TC-0336 | BatchInsert - 多条记录(3条) | ✅ pass |
| TC-0337 | BatchInsert - 批量插入含TokenVersion | ✅ pass |
| TC-0338 | BatchInsert - 唯一索引冲突 | ✅ pass |
| TC-0339 | BatchInsert - 大批量(1000条) | ✅ pass |
| TC-0340 | BatchInsertWithTx - 空列表 | ✅ pass |
| TC-0341 | BatchInsertWithTx - 正常多条 | ✅ pass |
| TC-0342 | BatchInsertWithTx - 事务回滚 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0343 | BatchUpdate - 空列表 | ✅ pass |
| TC-0344 | BatchUpdate - 单条记录 | ✅ pass |
| TC-0345 | BatchUpdate - 多条记录(3条) | ✅ pass |
| TC-0346 | BatchUpdate - 批量更新不污染数据 | ✅ pass |
| TC-0347 | BatchUpdate - 部分id不存在 | ✅ pass |
| TC-0348 | BatchUpdateWithTx - 空列表 | ✅ pass |
| TC-0349 | BatchUpdateWithTx - 正常多条 | ✅ pass |
| TC-0350 | buildBatchUpdateQuery - 单条 | ✅ pass |
| TC-0351 | buildBatchUpdateQuery - 多条 | ✅ pass |
| TC-0352 | buildBatchUpdateQuery - vals数量正确 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0353 | BatchDelete - 空ids | ✅ pass |
| TC-0354 | BatchDelete - 单个id | ✅ pass |
| TC-0355 | BatchDelete - 多个id(3个) | ✅ pass |
| TC-0356 | BatchDelete - 包含不存在id | ✅ pass |
| TC-0357 | BatchDeleteWithTx - 空ids | ✅ pass |
| TC-0358 | BatchDeleteWithTx - 正常多条 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0359 | FindOneByUsername - 正常查询 | ✅ pass |
| TC-0360 | FindOneByUsername - 不存在 | ✅ pass |
| TC-0361 | FindOneByUsernameWithTx - 事务内正常查询 | ✅ pass |
| TC-0362 | FindOneByUsernameWithTx - 事务内不存在 | ✅ pass |
| TC-0363 | FindOneByAppKey - 正常查询 | ✅ pass |
| TC-0364 | FindOneByAppKey - 不存在 | ✅ pass |
| TC-0365 | FindOneByAppKeyWithTx - 事务内正常查询 | ✅ pass |
| TC-0366 | FindOneByAppKeyWithTx - 事务内不存在 | ✅ pass |
| TC-0367 | FindOneByCode - 正常查询 | ✅ pass |
| TC-0368 | FindOneByCode - 不存在 | ✅ pass |
| TC-0369 | FindOneByCodeWithTx - 事务内正常查询 | ✅ pass |
| TC-0370 | FindOneByCodeWithTx - 事务内不存在 | ✅ pass |
| TC-0371 | FindOneByProductCodeCode - 正常查询 | ✅ pass |
| TC-0372 | FindOneByProductCodeCode - 不存在 | ✅ pass |
| TC-0373 | FindOneByProductCodeCodeWithTx - 事务内正常查询 | ✅ pass |
| TC-0374 | FindOneByProductCodeCodeWithTx - 事务内不存在 | ✅ pass |
| TC-0375 | FindOneByProductCodeName - 正常查询 | ✅ pass |
| TC-0376 | FindOneByProductCodeName - 不存在 | ✅ pass |
| TC-0377 | FindOneByProductCodeNameWithTx - 事务内正常查询 | ✅ pass |
| TC-0378 | FindOneByProductCodeNameWithTx - 事务内不存在 | ✅ pass |
| TC-0379 | FindOneByRoleIdPermId - 正常查询 | ✅ pass |
| TC-0380 | FindOneByRoleIdPermId - 不存在 | ✅ pass |
| TC-0381 | FindOneByRoleIdPermIdWithTx - 事务内正常查询 | ✅ pass |
| TC-0382 | FindOneByRoleIdPermIdWithTx - 事务内不存在 | ✅ pass |
| TC-0383 | FindOneByUserIdPermId - 正常查询 | ✅ pass |
| TC-0384 | FindOneByUserIdPermId - 不存在 | ✅ pass |
| TC-0385 | FindOneByUserIdPermIdWithTx - 事务内正常查询 | ✅ pass |
| TC-0386 | FindOneByUserIdPermIdWithTx - 事务内不存在 | ✅ pass |
| TC-0387 | FindOneByUserIdRoleId - 正常查询 | ✅ pass |
| TC-0388 | FindOneByUserIdRoleId - 不存在 | ✅ pass |
| TC-0389 | FindOneByUserIdRoleIdWithTx - 事务内正常查询 | ✅ pass |
| TC-0390 | FindOneByUserIdRoleIdWithTx - 事务内不存在 | ✅ pass |
| TC-0391 | FindOneByProductCodeUserId - 正常查询 | ✅ pass |
| TC-0392 | FindOneByProductCodeUserId - 不存在 | ✅ pass |
| TC-0393 | FindOneByProductCodeUserIdWithTx - 事务内正常查询 | ✅ pass |
| TC-0394 | FindOneByProductCodeUserIdWithTx - 事务内不存在 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0395 | findListByPrimaryKeys - 空ids | ✅ pass |
| TC-0396 | findListByPrimaryKeys - 正常ids | ✅ pass |
| TC-0397 | findListByPrimaryKeys - 部分不存在 | ✅ pass |
| TC-0398 | findListByPrimaryKeys - DB异常 | ✅ pass |
| TC-0399 | getPrimaryKeyValue - 正常 | ✅ pass |
| TC-0400 | formatPrimary - 正常 | ✅ pass |
| TC-0401 | queryPrimary - 正常 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0402 | cachePrefix为空 | ✅ pass |
| TC-0403 | cachePrefix非空 | ✅ pass |
| TC-0404 | 多唯一索引前缀(SysProduct) | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0405 | FindListByPage - 正常分页 | ✅ pass |
| TC-0406 | FindListByPage - 第二页 | ✅ pass |
| TC-0407 | FindListByPage - 空表 | ✅ pass |
| TC-0408 | FindListByPage - count查询失败 | ✅ pass |
| TC-0409 | FindListByPage - list查询失败 | ✅ pass |
| TC-0410 | FindListByProductMembers - 正常查询 | ✅ pass |
| TC-0411 | FindListByProductMembers - productCode不存在 | ✅ pass |
| TC-0412 | FindByIds - 正常批量查询 | ✅ pass |
| TC-0413 | FindByIds - 空ids | ✅ pass |
| TC-0414 | FindByIds - 部分id不存在 | ✅ pass |
| TC-0415 | FindByIds - DB异常 | ✅ pass |
| TC-0416 | FindIdsByDeptId - 有用户的部门 | ✅ pass |
| TC-0417 | FindIdsByDeptId - 无用户部门 | ✅ pass |
| TC-0418 | UpdateProfile 状态未变-不递增tokenVersion - statusChanged=false | ✅ pass |
| TC-0419 | UpdateProfile 状态变更-tokenVersion+1 - statusChanged=true | ✅ pass |
| TC-0420 | UpdateProfile 乐观锁冲突 - expectedUpdateTime 与DB不符 | ✅ pass |
| TC-0421 | UpdateProfile 并发场景 - 两个 goroutine 基于同一 updateTime 并发更新 | ✅ pass |
| TC-0422 | UpdateProfile userId不存在 - id=9999999 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0423 | FindList - 正常分页 | ✅ pass |
| TC-0424 | FindList - 空表 | ✅ pass |
| TC-0425 | FindList - count失败 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0426 | FindListByProductCode - 正常分页 | ✅ pass |
| TC-0427 | FindListByProductCode - 不存在的productCode | ✅ pass |
| TC-0428 | FindAllCodesByProductCode - 正常查询 | ✅ pass |
| TC-0429 | FindAllCodesByProductCode - 空结果 | ✅ pass |
| TC-0430 | FindByIds - 正常 | ✅ pass |
| TC-0431 | FindByIds - 空ids | ✅ pass |
| TC-0432 | FindMapByProductCode - 正常查询 | ✅ pass |
| TC-0433 | FindMapByProductCode - 空结果 | ✅ pass |
| TC-0434 | FindMapByProductCode - key唯一性 | ✅ pass |
| TC-0435 | DisableNotInCodesWithTx - codes非空-正常 | ✅ pass |
| TC-0436 | DisableNotInCodesWithTx - codes为空-全部禁用 | ✅ pass |
| TC-0437 | DisableNotInCodesWithTx - 无需禁用 | ✅ pass |
| TC-0438 | DisableNotInCodesWithTx - DB异常 | ✅ pass |
| TC-0439 | FindAllCodesByProductCode - 有权限产品 | ✅ pass |
| TC-0440 | FindAllCodesByProductCode - 无权限产品 | ✅ pass |
| TC-0441 | FindAllCodesByProductCode - 全部已禁用 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0442 | FindAll - 正常查询 | ✅ pass |
| TC-0443 | FindAll - 空表 | ✅ pass |
| TC-0444 | FindByParentId - 正常查询 | ✅ pass |
| TC-0445 | FindByParentId - 无子部门 | ✅ pass |
| TC-0446 | FindByPathPrefix - 正常查询 | ✅ pass |
| TC-0447 | FindByPathPrefix - LIKE注入已阻止 | ✅ pass |
| TC-0448 | FindByPathPrefix - 无匹配 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0449 | FindListByProductCode - 正常分页 | ✅ pass |
| TC-0450 | FindListByProductCode - 空结果 | ✅ pass |
| TC-0451 | FindByIds - 正常 | ✅ pass |
| TC-0452 | FindByIds - 空ids | ✅ pass |
| TC-0453 | FindMinPermsLevelByUserIdAndProductCode - 有角色用户 | ✅ pass |
| TC-0454 | FindMinPermsLevelByUserIdAndProductCode - 无角色用户 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0455 | FindPermIdsByRoleId - 正常查询 | ✅ pass |
| TC-0456 | FindPermIdsByRoleId - 无绑定 | ✅ pass |
| TC-0457 | FindPermIdsByRoleIds - 正常查询 | ✅ pass |
| TC-0458 | FindPermIdsByRoleIds - 空roleIds | ✅ pass |
| TC-0459 | FindPermIdsByRoleIds - 去重验证 | ✅ pass |
| TC-0460 | DeleteByRoleIdTx - 正常事务内删除 | ✅ pass |
| TC-0461 | DeleteByRoleIdTx - 无绑定 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0462 | FindPermIdsByUserIdAndEffectForProduct - ALLOW-指定产品 | ✅ pass |
| TC-0463 | FindPermIdsByUserIdAndEffectForProduct - DENY-指定产品 | ✅ pass |
| TC-0464 | FindPermIdsByUserIdAndEffectForProduct - 无记录/其他产品 | ✅ pass |
| TC-0465 | DeleteByUserIdForProductTx - 事务内跨产品删除 | ✅ pass |
| TC-0466 | DeleteByUserIdForProductTx - 跨产品隔离 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0467 | FindRoleIdsByUserId - 正常查询 | ✅ pass |
| TC-0468 | FindRoleIdsByUserId - 无绑定 | ✅ pass |
| TC-0469 | DeleteByRoleIdTx - 正常删除 | ✅ pass |
| TC-0470 | DeleteByUserIdForProductTx - 事务内跨产品删除 | ✅ pass |
| TC-0471 | DeleteByUserIdForProductTx - 跨产品隔离 | ✅ pass |
| TC-0472 | FindUserIdsByRoleId - 有绑定的角色 | ✅ pass |
| TC-0473 | FindUserIdsByRoleId - 无绑定角色 | ✅ pass |
| TC-0474 | FindRoleIdsByUserIdForProduct - 跨产品过滤 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0475 | FindListByProductCode - 正常分页 | ✅ pass |
| TC-0476 | FindListByProductCode - 空结果 | ✅ pass |
| TC-0477 | FindMapByProductCodeUserIds - 正常批量 | ✅ pass |
| TC-0478 | FindMapByProductCodeUserIds - 空userIds | ✅ pass |
| TC-0479 | FindMapByProductCodeUserIds - 部分不是成员 | ✅ pass |
| TC-0480 | FindMapByProductCodeUserIds - map key正确 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0481 | 超管通过 | ✅ pass |
| TC-0482 | 非超管拒绝 | ✅ pass |
| TC-0483 | MEMBER拒绝 | ✅ pass |
| TC-0484 | 未登录 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0485 | 超管通过 | ✅ pass |
| TC-0486 | ADMIN通过(同产品) | ✅ pass |
| TC-0487 | DEVELOPER拒绝 | ✅ pass |
| TC-0488 | MEMBER拒绝 | ✅ pass |
| TC-0489 | 未登录 | ✅ pass |
| TC-0490 | ADMIN跨产品拒绝 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0491 | 超管可分配任何类型 | ✅ pass |
| TC-0492 | ADMIN分配DEVELOPER | ✅ pass |
| TC-0493 | ADMIN分配ADMIN(同级拒绝) | ✅ pass |
| TC-0494 | DEVELOPER分配ADMIN(越级拒绝) | ✅ pass |
| TC-0495 | MEMBER分配MEMBER(同级拒绝) | ✅ pass |
| TC-0496 | 未登录 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0497 | 超管可管理任何人 | ✅ pass |
| TC-0498 | 操作自己 | ✅ pass |
| TC-0499 | ADMIN跳过部门检查 | ✅ pass |
| TC-0500 | 非ADMIN无部门拒绝 | ✅ pass |
| TC-0501 | 目标用户无部门 | ✅ pass |
| TC-0502 | 目标在不同部门 | ✅ pass |
| TC-0503 | 未登录 | ✅ pass |
| TC-0504 | caller.DeptPath为空时拒绝 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0505 | 各类型优先级正确 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0506 | DB加载(缓存miss) | ✅ pass |
| TC-0507 | 缓存命中 | ✅ pass |
| TC-0508 | 用户不存在 | ✅ pass |
| TC-0509 | productCode为空 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0510 | Del删除指定缓存 | ✅ pass |
| TC-0511 | Clean清除用户所有产品缓存 | ✅ pass |
| TC-0512 | CleanByProduct清除产品所有用户 | ✅ pass |
| TC-0513 | BatchDel批量删除 | ✅ pass |
| TC-0514 | BatchDel空数组 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0515 | 超管全量权限 | ✅ pass |
| TC-0516 | ADMIN全量权限 | ✅ pass |
| TC-0517 | DEVELOPER全量权限 | ✅ pass |
| TC-0518 | DEV部门全量权限 | ✅ pass |
| TC-0519 | MEMBER角色权限+ALLOW-DENY | ✅ pass |
| TC-0520 | 用户ALLOW权限不跨产品泄漏 | ✅ pass |
| TC-0521 | 禁用DEV部门成员无全量权限 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0522 | 多角色取最小permsLevel | ✅ pass |
| TC-0523 | 无角色 | ✅ pass |
| TC-0524 | 角色跨产品过滤 | ✅ pass |
| TC-0525 | 禁用角色不计入 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0526 | 超管自动设置SUPER_ADMIN | ✅ pass |
| TC-0527 | 非成员MemberType为空 | ✅ pass |
| TC-0528 | 禁用成员MemberType为空 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0529 | 冻结用户被403 | ✅ pass |
| TC-0530 | 用户不存在(Status=0) | ✅ pass |
| TC-0531 | UserDetails注入context | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0532 | createDept非超管拒绝 | ✅ pass |
| TC-0533 | updateDept非超管拒绝 | ✅ pass |
| TC-0534 | deleteDept非超管拒绝 | ✅ pass |
| TC-0535 | createProduct非超管拒绝 | ✅ pass |
| TC-0536 | updateProduct非超管拒绝 | ✅ pass |
| TC-0537 | createUser非产品管理员拒绝 | ✅ pass |
| TC-0538 | createRole非产品管理员拒绝 | ✅ pass |
| TC-0539 | updateRole非产品管理员拒绝 | ✅ pass |
| TC-0540 | deleteRole非产品管理员拒绝 | ✅ pass |
| TC-0541 | bindRolePerms非产品管理员拒绝 | ✅ pass |
| TC-0542 | updateUser-MEMBER不能管理他人 | ✅ pass |
| TC-0543 | updateUser自己修改DeptId被拒绝 | ✅ pass |
| TC-0544 | updateUser自己修改Status被拒绝 | ✅ pass |
| TC-0545 | updateUser未登录被拒绝 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 |
|---|---|---|
| TC-0546 | 正常请求(未超限) | ✅ pass |
| TC-0547 | 超限请求被拒绝 | ✅ pass |
| TC-0548 | behindProxy=false时XFF被忽略 | ✅ pass |
| TC-0549 | behindProxy=false时X-Real-IP被忽略 | ✅ pass |
| TC-0550 | IP从RemoteAddr解析 | ✅ pass |
| TC-0551 | 不同IP独立限流 | ✅ pass |
| TC-0552 | behindProxy=true时信任X-Real-IP | ✅ pass |
| TC-0553 | behindProxy=true时无X-Real-IP回退RemoteAddr | ✅ pass |
| TC-0554 | behindProxy=true时XFF仍被忽略 | ✅ pass |
| TC-0555 | RemoteAddr无端口格式 | ✅ pass |
| TC编号 | 测试场景 | 测试结果 | 关联修复 |
|---|---|---|---|
| TC-0208 | MEMBER 仍被 permsLevel 校验阻断 | ✅ pass | H-1 |
| TC-0711 | ADMIN 绕过 permsLevel 校验 | ✅ pass | H-1 |
| TC-0712 | DEVELOPER 绕过 permsLevel 校验 | ✅ pass | H-1 |
| TC-0713 | MEMBER w/ MinPermsLevel=MaxInt64 不被误阻断 | ✅ pass | H-1 |
| TC-0700 | gRPC GetUserPerms 冻结用户 → PermissionDenied | ✅ pass | H-2 |
| TC-0701 | gRPC GetUserPerms 非成员 → PermissionDenied | ✅ pass | H-2 |
| TC-0702 | gRPC GetUserPerms DEV+禁用成员 → PermissionDenied | ✅ pass | H-2 + H-3 |
| TC-0703 | gRPC GetUserPerms 正常成员 → 成功 | ✅ pass | H-2 (positive) |
| TC-0704 | Loader:DEV 部门 + 禁用成员不发全量权限 | ✅ pass | H-3 |
| TC-0705 | Loader:不存在用户不留缓存 | ✅ pass | L-5 |
| TC-0706 | FindRoleIdsByUserIdForProduct 过滤 r.status=1 | ✅ pass | M-4 |
| TC-0707 | DeleteByUserIdAndRoleIdsTx 批量删除 | ✅ pass | M-2 |
| TC-0708 | DeleteByUserIdAndRoleIdsTx 空列表 no-op | ✅ pass | M-2 |
| TC-0709 | DeleteByUserIdAndRoleIdsTx userId 约束 | ✅ pass | M-2 |
| TC-0710 | 产品/管后登录限流独立桶 | ✅ pass | L-2 |
| TC-0716 | JWT access token payload 不含 "perms" key | ✅ pass | M-6 |
| TC-0105 | UpdateDept 不再级联子部门缓存 + UpdateWithOptLock | ✅ pass | M-5 |
| TC-0714 | UpdateDept 无关字段变更不清缓存 | ✅ pass | M-5 |
| TC-0715 | UpdateDept 乐观锁冲突返回 ErrConflict | ✅ pass | M-5 |
| TC-0181 | UserDetail 超管在产品上下文仅返回该产品 roleIds | ✅ pass | M-3 |
| TC-0108 | DeleteDept 不存在部门返回 404 | ✅ pass | M-11 |
| TC编号 | 测试场景 | 测试结果 | 关联修复 |
|---|---|---|---|
| TC-0720 | Logout 正常:tokenVersion 0→1 且 loader 缓存被清理 | ✅ pass | M-1 |
| TC-0721 | Logout 未登录返回 401 | ✅ pass | M-1 |
| TC-0722 | Logout 连续两次 tokenVersion 累加至 2 | ✅ pass | M-1 |
| TC-0723 | RemoveMember 移除产品最后一个 ADMIN 被拒 | ✅ pass | H-4 |
| TC-0724 | RemoveMember 有 2 个 ADMIN 时可以移除其一 | ✅ pass | H-4 |
| TC-0725 | UpdateMember 降级唯一 ADMIN 被拒 | ✅ pass | H-4 |
| TC-0726 | UpdateMember 有 2 个 ADMIN 时降级其一成功 | ✅ pass | H-4 |
| TC-0727 | UpdateMember 仅 1 个启用 ADMIN 时降级被拒(CountActiveAdmins 只算 Enabled) | ✅ pass | H-4 |
| TC-0728 | RemoveMember 非 ADMIN 不触发 last-admin 校验 | ✅ pass | H-4 |
| TC-0729 | AddMember 禁用产品拒绝添加成员 | ✅ pass | L-5 |
| TC-0730 | UpdateRole 非超管降低 PermsLevel 被拒 | ✅ pass | L-3 |
| TC-0731 | UpdateRole 非超管保持/提升 PermsLevel 允许 | ✅ pass | L-3 |
| TC-0732 | UpdateRole 超管可任意降低 PermsLevel | ✅ pass | L-3 |
| TC-0733 | UpdateRole PermsLevel 越界拒绝 (0/-1/1000/10000) | ✅ pass | L-3 |
| TC-0734 | SetUserPerms 产品被禁用时拒绝 | ✅ pass | M-14 |
| TC-0735 | SetUserPerms 产品不存在返回 404 | ✅ pass | M-14 |
| TC编号 | 测试场景 | 测试结果 | 关联修复 |
|---|---|---|---|
| TC-0736 | IncrementTokenVersion 返回值 == DB 持久值 | ✅ pass | H-B |
| TC-0737 | IncrementTokenVersion 事务成功后主动清缓存 | ✅ pass | H-B |
| TC-0738 | 10 goroutine 并发自增:返回值唯一 & 最终 DB = 起始+N | ✅ pass | H-B |
| TC-0739 | Logout 超过 TokenOpLimiter 配额返 429 且不再递增 tokenVersion | ✅ pass | L-C |
| TC-0740 | Logout 限流按 userId 隔离(A 满额不影响 B) | ✅ pass | L-C |
| TC-0741 | RefreshToken 超配额返 429 且不递增 tokenVersion | ✅ pass | M-B |
| TC-0742 | RefreshToken 限流按 userId 隔离(productCode 无关) | ✅ pass | M-B |
| TC-0743 | SetUserPerms 普通 MEMBER 不得给自己授权 | ✅ pass | H-A |
| TC-0744 | SetUserPerms DEVELOPER 调用者被拦截(非 self 场景) | ✅ pass | H-A |
| TC-0745 | SetUserPerms 同产品 ADMIN 操作合法 MEMBER 放行 | ✅ pass | H-A |
| TC-0746 | UpdateUser DEVELOPER 跨子树移动目标被拒 | ✅ pass | L-F |
| TC-0747 | UpdateUser DEVELOPER 子树内移动放行 | ✅ pass | L-F |
| TC-0748 | UpdateUser 产品 ADMIN 不受子树限制 | ✅ pass | L-F |
| TC-0749 | jwtauth TokenVersion 失效优先于 ProductStatus 返回 401 | ✅ pass | L-B |
| TC-0750 | jwtauth TokenVersion 通过后才返回 403 "产品已禁用" | ✅ pass | L-B |
| TC-0751 | ValidateProductLogin 用户名不存在走 dummy bcrypt 返同文案 | ✅ pass | M-C |
| TC-0752 | ValidateProductLogin 用户名存在但密码错:与 TC-0751 对照一致 | ✅ pass | M-C |
| TC-0753 | UsernameLoginLimit 按 ip:username 分桶,不误伤同 IP 其他用户 |
✅ pass | M-C |
audit-report.md H-A / H-B / M-B / M-C / L-B / L-C / L-F 共 7 项高/中/低风险修复新增 18 组专项对抗性回归用例 (TC-0736 ~ TC-0753)。连同第 1 批 16 组 (TC-0720 ~ TC-0735) + 第 0 批零散修复 15 组 (TC-0105、TC-0108、TC-0181、TC-0208、TC-0700 ~ TC-0716) = 累计 49 组专项审计回归用例全部通过,断言严格对齐修复后行为,未向旧逻辑妥协。./... 覆盖率 57.8% 包含大量 handler 薄层 / pb / permclient / testutil 生成或桩代码。claims 类型断言失败,运行时无法触达),已标记 t.Skip,不影响业务正确性。model/perm.TestSysPermModel_BatchInsert_Bulk1000 在 go test ./... -v 全量并行运行时偶发因 1000 行大批插入与其他包测试数据清理争用同一测试 DB 而失败;独立重跑、-cover ./... 串行与 go test ./internal/model/perm 单包跑均稳定 PASS,属测试基础设施 flaky,已在"后续测试建议"中列为改进项。| 风险项 | 修复验证断言 | 价值 |
|---|---|---|
| H-1 | ADMIN/DEVELOPER 不再被 permsLevel 误阻 (TC-0711/0712);MEMBER sentinel 场景被保护 (TC-0713);MEMBER 越权仍拒绝 (TC-0208) | 阻止"本该有权的管理员被自家规则误杀"的 P0 生产故障 |
| H-2 + H-3 | gRPC GetUserPerms 对冻结/非成员/DEV 部门禁用成员全部 PermissionDenied (TC-0700~0702);Loader 层亦验证 DEV+禁用成员不再命中全量权限分支 (TC-0704) | 堵住攻击面最广的 token 发放旁路,横跨 API 与 RPC |
| M-2 | 批量 DELETE ... IN (...) 正确性 + 空集合保护 + userId WHERE 约束 (TC-0707~0709) |
消除 N+1,提升 BindRoles/BindRolePerms 大批量操作性能 |
| M-3 | 超管产品上下文只返回该产品角色 (TC-0181) | 防止跨产品信息越权 |
| M-4 | 禁用角色被严格过滤 (TC-0706) | 避免 Loader 因过期绑定返回错误 MemberType |
| M-5 | 乐观锁冲突可检出;DeptType/Status 未变时不触发级联缓存清理 (TC-0105/0714/0715) | 防并发更新丢字段 + 消除 O(N) 缓存抖动 |
| M-6 | access token payload 确实不存在 perms 字段 (TC-0716,base64 解码校验) |
清理长期 Dead field,缩小 token 体积/攻击面 |
| M-11 | 删除不存在部门返回 404 而非静默成功 (TC-0108) | 消除 TOCTOU + 调用方误以为成功的隐性 BUG |
| L-2 | 产品登录耗尽配额后管后登录仍可放行 (TC-0710) | 避免攻击一条入口拖垮另一条 |
| L-5 (Loader) | Loader 对不存在用户不留缓存,多次调用均走 DB (TC-0705) | 避免零值 UserDetails 长期污染缓存 |
| H-4 | 产品最后一个启用 ADMIN 不能被移除或降级 (TC-0723~0727);禁用成员不计入 active 计数 (TC-0727);非 ADMIN 不受影响 (TC-0728) | 阻断"误删最后一个管理员导致产品完全失控"的 P0 事故 |
| M-1 | /auth/logout 真正递增 tokenVersion 并清 Loader 缓存;未登录返 401;多次登出累加 (TC-0720~0722) |
让"登出"不再是假操作,后续 refresh token 直接作废 |
| M-14 | setUserPerms 对已禁用产品 400 拒绝;产品不存在 404 (TC-0734/0735) | 消除"产品已禁用但管理员仍能给成员发权限"的漏洞 |
| L-3 | 非超管 admin 不得降低 role.PermsLevel,但保持/提升被允许;超管例外 (TC-0730~0732);越界参数 400 (TC-0733) | 阻断"普通 admin 通过降低角色级别绕过权限层级"的越权路径 |
| L-5 (addMember) | 禁用产品禁止新增成员 (TC-0729) | 让"产品禁用"真正形成写操作闭环,不仅 login / refresh 失效,DDL 类写入亦被拦截 |
| H-A | SetUserPerms 调用者必须是同产品 ADMIN/超管:MEMBER 自提权被拦 (TC-0743);DEVELOPER 操作他人同样被拦 (TC-0744);合法 ADMIN 通路未受损 (TC-0745) |
阻断"普通成员直接调用 /setUserPerms 自我赋权"的 P0 越权,切断最短 root 路径 |
| H-B | IncrementTokenVersion 原子自增 (LAST_INSERT_ID(tokenVersion+1)):返回值 == DB 值 (TC-0736)、主动清缓存 (TC-0737)、10 并发返回值唯一且终值 = 起始+N (TC-0738) |
消除旧实现"读缓存 + 1"在并发下的 stale write,保证登出/强制踢出后所有老 token 必然作废 |
| M-B | /auth/refreshToken 接入 TokenOpLimiter:超配额 429 且不再递增 tokenVersion (TC-0741);按 userId 隔离 (TC-0742) |
阻止攻击者用 refresh 接口持续废除合法用户的 refresh token(DoS 自己);且限流命中路径不进入业务层副作用 |
| L-C | /auth/logout 接入 TokenOpLimiter:超配额 429 且不递增 tokenVersion (TC-0739);按 userId 分桶 (TC-0740) |
切断"反复调 logout 把 tokenVersion 冲高 + 污染缓存"的低成本骚扰攻击 |
| M-C | 产品登录用户名枚举防护:不存在用户仍走 dummy bcrypt 返同一错误文案 (TC-0751/0752);UsernameLoginLimit key = ip:username (TC-0753) |
消除通过响应文案/时序差异枚举用户名的攻击面;限流按用户粒度隔离避免同 IP 被一个失败账号拖垮 |
| L-B | jwtauthMiddleware 校验顺序:TokenVersion 失效优先于 ProductStatus (TC-0749),通过后才看产品状态 (TC-0750) |
保证强制踢出/登出后客户端立刻拿到 401 (而非 403 "产品禁用"),前端能走正确的"重新登录"分支 |
| L-F | UpdateUser DEVELOPER 必须在自身子树内移动目标 (TC-0746/0747);ADMIN 豁免 (TC-0748) |
防止 DEVELOPER 把成员挪出自己职责子树从而变相"扩大接管范围" |
permsLevel 检查重新加回 ADMIN 分支、把 FindRoleIdsByUserIdForProduct 过滤条件去掉、或把 sys_dept 的乐观锁摘掉,相应 TC 会立即失败。M-5 的乐观锁只通过 mock 层验证;建议补一组"真实并发双写 sys_dept"集成测试 (可用 t.Parallel + goroutine + DBretry)。model/perm.TestSysPermModel_BatchInsert_Bulk1000 在全包并行跑时偶发与其他包清理操作争用同一测试 DB;建议为大批量插入类用例启用独立 schema / 独立连接池,或使用 t.Cleanup + 唯一表前缀 隔离,彻底消除 flaky。TokenOpLimiter 窗口粒度模糊测试:当前 TC-0739/0741 用 quota=1~2 的边界打;建议补 TTL 窗口滚动后恢复的时间窗场景,确保限流不会因时钟偏移/Redis 过期策略意外 fail-open。