适用范围
约束所有功能的角色、作用域、权限判定时机与表达方式。
不约束:凭据的存储与轮换实现;界面如何呈现按钮(由各功能的表现设计决定);具体角色的业务语义(由各功能定义,但必须落在本规格的层级与判定规则内)。
规范条款
作用域层级
- 权限作用域必须落在下列层级之一,且必须显式声明:
| 层级 | 说明 |
|---|
| 工作空间级 | 跨项目;影响整个工作空间 |
| 项目级 | 限定在单一项目 |
| 对象级 | 限定在单一对象(工作项、页面等) |
- 必须不存在"跨工作空间"的权限;跨工作空间的访问必须被拒绝。
- 子层级权限必须不自动获得父层级权限;反向亦然——必须按声明的层级判定。
身份类型
- 身份必须区分为下列类型,且必须不互相冒充:
| 类型 | 可用于 | 必须不可用于 |
|---|
| 人类成员 | 按角色的业务操作 | 服务间调用 |
| 服务身份 | 该服务被授权的作用域 | 代替人类做业务判断 |
| 外部协作者 | 被显式授予的最小范围 | 管理类操作 |
- 人类成员身份必须不被当作执行器选择或指派目标使用;身份的变化必须不改变已有的执行事实。
判定时机与权威
- 权限必须在服务端、在每次请求时判定;必须不依赖客户端声明的权限。
- 判定必须基于请求时的当前状态;状态变化后必须重新判定,必须不沿用请求发起时的判定结果。
- 服务端必须返回派生的是否可执行判定;客户端必须不自行推断可用性。
- 权限判定必须不受缓存影响:失效的授权必须在下一次请求即失效。
非成员与不存在
- 对无权限与对象不存在,必须返回同形结果;必须不泄漏对象是否存在。
- 权限不足时必须停止;必须不通过替换操作或降级路径达成同一效果。
授权与批准分离
- 业务操作权限与批准权限(对不可逆动作的放行)必须分离;必须不由同一次授权同时覆盖。
- 不可逆动作必须停在明确的批准门之前(例如首次安装、激活、凭据创建与轮换、生产变更、破坏性数据操作)。
- 批准必须可追溯:必须记录批准人、时间与范围。
- 批准必须不被泛化:一次批准必须不自动覆盖其它对象、其它作用域或后续操作。
表达要求
- 每个功能必须在能力面提供权限矩阵,列明每个角色能否执行每个操作;缺矩阵即视为未完成。
- 权限矩阵必须覆盖"操作在某状态下不可执行"的情形,并必须说明原因类别(无权限 / 状态不允许 / 前置缺失)。
违反时的失败语义
| 违反情形 | 必须的行为 |
|---|
| 缺权限矩阵 | 视为规格违反;评审阶段必须拦截 |
| 客户端自行判断可用性 | 必须改为服务端派生;否则会出现绕过判定的路径 |
| 权限不足却泄漏存在性 | 必须改为同形返回 |
| 权限被缓存后仍生效 | 必须改为每次判定 |
| 服务身份代替人类做业务判断 | 必须拆分为两条路径 |
| 一次批准被泛化 | 必须按对象与作用域重新批准 |
校验方式
| 校验对象 | 判据 | 失败表现 |
|---|
| 矩阵完备 | 每个操作必须能在权限矩阵中定位到角色判定 | 缺失即失败 |
| 服务端判定 | 构造客户端声明的宽松权限不得影响结果 | 影响即失败 |
| 当前状态判定 | 使状态变化后以原判定执行必须被拒绝 | 被接受即失败 |
| 非成员同形 | 非成员访问与不存在必须返回同形结果 | 可区分即失败 |
| 身份隔离 | 服务身份不得执行人类业务操作,反向亦然 | 可执行即失败 |
| 批准可追溯 | 不可逆动作必须能定位到批准人、时间与范围 | 缺失即失败 |
| 授权失效 | 撤销授权后下一次请求必须即失效 | 仍生效即失败 |
相关规格