概述
多数团队会测试匿名用户被拦截、管理员可以做任何事,漏洞却出在中间地带:已登录用户请求了属于别人的对象。接口校验了身份,随后只按 id 查询,忘了租户或归属条件。UI 从不会展示那个 id,手工测试发现不了,脚本几分钟就能找到。
步骤
- 把策略写成表,每个用例都有明确的期望状态:
const cases = [
{ as: 'anonymous', expected: 401 },
{ as: 'bob-other-tenant', expected: 404 },
{ as: 'carol-same-tenant', expected: 403 },
{ as: 'alice-owner', expected: 200 },
];
- 准备两个租户、同租户非所有者、所有者与管理员四类身份。
- 对读接口执行矩阵,失败信息带上用例名。
- 对写接口与列表接口重复矩阵,防止只有详情接口做了校验。
- 验证缺失角色声明返回 403、伪造令牌返回 401,确保默认拒绝。
验证
匿名 401、跨租户 404、同租户非所有者 403、所有者与管理员 200。跨租户用户调用列表接口应返回空数组,直接修改 id 也不能更新成功。删掉 handler 中的归属校验后,对应用例应立即失败并指出具体身份。
注意事项
- 403 与 404 的选择要统一:跨租户通常返回 404 以避免 id 枚举。
- 用例之间共享用户会导致相互影响,应在事务中为每个测试创建独立数据。
- 只测管理员会掩盖缺失的校验,权限最小的角色才是重点。
- 矩阵随角色与资源增长,规模变大后应由策略表自动生成。
- 该测试覆盖服务端授权,不覆盖前端是否隐藏了不应提供的操作。