首页/开发/系统分析与架构设计速查/授权范围(Scope)设计

授权范围(Scope)设计

Scope 表达令牌被授予的能力边界:按资源与动作命名(orders:read、orders:write),服务端逐请求校验;范围过粗失去最小权限意义,过细难以维护。

什么是授权范围设计

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 是常见漏洞:没有声明就没有拦截,令牌持有者可越权调用,审计也查不出越界。

易错点

  • 所有接口共用一个全权限 scope,权限隔离形同虚设
  • 接口未声明所需 scope,越权调用无从拦截也无法审计
  • scope 只增不减,历史范围长期保留,最小权限难以维持
  • 把 scope 与角色混为一谈,接口直接判断角色名,调整组织架构即失效

数据来源与参考

  • RFC 6749:OAuth 2.0(3.3 Access Token Scope)
  • RFC 9700:OAuth 2.0 Security Best Current Practice
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌