什么是授权范围设计
Scope 表达令牌被授予的能力边界,是按资源与动作命名的权限集合,例如 orders:read、orders:write、reports:export。服务端在每个接口上声明所需 scope 并在运行时逐项校验令牌,令牌缺少所需范围即返回 403。范围过粗会失去最小权限的意义,过细则难以维护和授权。常见做法是角色映射到 scope 集合,用户与权限解耦。
基本信息
| 命名约定 | 资源:动作 形式,语义清晰且便于审计 |
|---|---|
| 校验方式 | 接口声明所需 scope,运行时逐项判断,默认拒绝 |
| 治理流程 | scope 增删走评审;下线接口同步回收 scope |
| 与角色关系 | 角色是 scope 的集合,用户绑定角色而非直接绑 scope |
典型使用场景
- 第三方授权:只授予对方所需的读取或写入范围,降低越权风险
- 前端与后端分离:用户登录后按页面能力申请范围,减少长期超权令牌
- 服务间调用:以客户端身份申请范围,避免内部服务持有全权限凭证
- 审计与合规:按 scope 统计访问行为,为合规报告提供依据
- 分级授权:基础能力与敏感操作分开,敏感操作按需追加范围
- 范围收敛:定期复核实际使用的 scope,回收长期未用项
scope 命名与校验示意
scope 命名与校验示意
# 命名(资源:动作)
orders:read 读取订单
orders:write 创建与修改订单
orders:cancel 取消订单(敏感,单独授予)
reports:export 导出报表
# 接口声明与校验
GET /orders 需要 orders:read
POST /orders 需要 orders:write
POST /orders/{id}/cancel 需要 orders:cancel
# 校验逻辑
令牌 scope 不包含接口所需范围 -> 返回 403 并记录审计日志范围粒度取舍
| 粒度 | 优点 | 代价 |
|---|---|---|
| 过粗(如全权限) | 配置简单 | 失去最小权限意义,越权影响面大 |
| 适中(资源:动作) | 可审计、可组合 | 需要维护范围清单与接口映射 |
| 过细(字段级) | 权限最精确 | 授权与维护成本高,易出错 |
Scope 属于授权语义,与角色模型配合使用:接口只认 scope,角色负责把权限打包给用户,这样调整角色不必改接口。
接口未声明所需 scope 是常见漏洞:没有声明就没有拦截,令牌持有者可越权调用,审计也查不出越界。