← 中文资源

简体中文版本

把授权矩阵当作测试来运行

给定每个参与者用例的期望状态码与接口实际返回的状态码,报告矩阵是否通过以及哪些用例出现偏差。

阅读英文原文

任务

逐条比对期望状态与实际状态,输出矩阵是否通过,并按名称列出所有不一致的用例。

契约

  • 输入:JSON 对象:{ cases: [{ name, expected }], actual: { [name]: number } }
  • 输出:JSON 对象:{ passed: boolean, failed: string[] }

样例

  1. 输入 {"cases":[{"name":"anonymous","expected":401},{"name":"owner","expected":200},{"name":"admin","expected":200}],"actual":{"anonymous":401,"owner":200,"admin":403}} -> 期望 {"passed":false,"failed":["admin"]}。admin 用例期望 200,实际返回 403。
  2. 输入 {"cases":[{"name":"other-tenant","expected":404},{"name":"same-tenant","expected":403}],"actual":{"other-tenant":404,"same-tenant":403}} -> 期望 {"passed":true,"failed":[]}。所有用例都与期望状态一致。

参考实现

function solve({ cases, actual }) {
      const failed = cases.filter((c) => actual[c.name] !== c.expected).map((c) => c.name);
      return { passed: failed.length === 0, failed };
    }

为什么有效

对象级授权漏洞往往藏在角色之间的缝隙里。把期望状态写成数据,等于把访问控制变成回归测试,而不是代码评审时的个人看法。

缺失的实际状态计为失败;不要把 undefined 当成通过。