第三章:权限模型选型权衡——RBAC、ABAC、PBAC的适用边界与组合策略
在审批流系统中,权限模型决定了“谁能在什么条件下对什么资源执行什么操作”。选型不当会导致权限爆炸、维护困难或安全漏洞。本章从边界、分层、组件职责、数据/控制流、信任链路、选型权衡、风险点、落地步骤及验收标准九个维度,剖析三种主流模型——RBAC(基于角色的访问控制)、ABAC(基于属性的访问控制)、PBAC(基于策略的访问控制)——的适用场景与组合策略。
3.1 适用边界与核心差异
| 维度 | RBAC | ABAC | PBAC |
|---|---|---|---|
| 决策依据 | 用户所属角色 | 主体、资源、环境属性 | 预定义策略规则(JSON/YAML) |
| 灵活性 | 低(角色固定、权限静态) | 高(属性任意组合) | 中(策略可热更新,但需策略引擎) |
| 维护成本 | 中(角色数量膨胀后剧增) | 高(属性管理、策略审计复杂) | 中(策略分离,需统一治理) |
| 典型场景 | 部门固定、职责明确的审批流 | 多租户、多维度条件(时间/地点/数据级别) | 合规驱动、审计严格的企业级策略 |
| 风险点 | 角色爆炸、权限扩散 | 属性冲突、性能瓶颈 | 策略规则循环、策略引擎单点 |
架构提示:三种模型并非互斥。实际落地中,92%的企业采用RBAC + ABAC混合模式:基础角色控制大范围访问,属性规则做精细拦截。
3.2 分层与组件职责
推荐分层架构如下:
- 身份层:用户、组、角色元数据(LDAP / OIDC 提供者)。
- 属性层:环境属性(时间、IP、客户端)、资源属性(文档密级、部门)、上下文属性(审批阶段、金额区间)。
- 策略层:策略库管理(PBAC 核心),存储策略定义并支持版本控制。
- 决策层:策略决策点(PDP)——根据策略和属性计算授权结果(allow/deny)。
- 执行层:策略执行点(PEP)——拦截请求,调用 PDP 并实施结果。
信任链路风险:PDP 必须位于安全边界内,不可暴露给终端。属性源(如时间戳)需防篡改,生产环境建议使用签名令牌。
3.3 数据流与控制流
- 控制流:用户发起审批动作 → PEP 拦截请求 → PDP 获取主体/资源/环境属性 → PDP 匹配策略规则(RBAC/ABAC/PBAC混合) → 返回 allow/deny → PEP 放行或拒绝。
- 数据流:PDP 通过接口从身份服务获取角色,从属性服务获取实时属性(如审批金额),从策略库加载策略定义。决策日志异步写入审计数据库。
落地注意:属性查询延迟应控制在 50ms 以内,否则影响审批流效率。建议对频繁使用的属性(如角色)做本地缓存,对变化快的属性(如当前时间)使用本地时钟偏移校验。
3.4 选型权衡矩阵
实际项目中,需根据以下变量综合选择:
- 角色数量:超过 50 个角色时,RBAC 易出现角色膨胀,需引入 ABAC 垂直切片。
- 属性维度:超过 4 个独立属性(如时间、地域、金额、部门)时,ABAC 优于纯 RBAC。
- 策略变更频率:每周变更 > 3 次,建议 PBAC 策略中心 + 灰度发布。
- 审计要求:需追溯“为何拒绝”时,PBAC 提供结构化策略日志优于硬编码。
3.5 组合策略推荐
- 基础层(RBAC):定义核心角色(财务经理、法务、采购专员),分配基础 CRUD 权限。
- 条件层(ABAC):在角色之上叠加条件,如“仅限周一至周五 09:00-18:00 可提交审批金额 > 10万”。
- 治理层(PBAC):使用 OPA(Open Policy Agent)或类似引擎定义全局策略,如“任何审批均需最终复核人签名确认”。
策略示例:
package approval
default allow = false
allow {
input.role in ["finance_manager", "legal_approver"]
input.action == "approve"
input.amount <= 100000
time.weekday >= 1
time.weekday <= 5
time.hour >= 9
time.hour < 18
}
3.6 风险点与应对
- 策略覆盖遗漏:混合模型中,ABAC 条件可能被 PBAC 策略绕过,需建立策略冲突检测。
- 性能退化:ABAC 属性查询过多导致 PDP 响应超时,建议对角色和静态属性做本地缓存,动态属性使用异步刷新。
- 权限循环:PBAC 策略规则中若存在互相引用的 allow/deny,容易死锁,需做规则拓扑排序预防。
3.7 落地步骤
- 权限需求梳理:与业务方确认至少 10 个典型审批场景(工单、报销、合同等)。
- 模型基线选择:角色数 ≤ 30 且属性简单 → 纯 RBAC;否则采用 RBAC+ABAC 混合。
- 策略引擎选型:部署 OPA 或内置策略引擎,确保支持热加载。
- 属性源接入:打通 HR 系统(部门、职级)、CRM(客户等级)、财务系统(金额段)。
- 全链路测试:覆盖边界条件(午夜、跨时区、角色缺失、属性为空)。
- 灰度上线:先让 5% 用户切到新权限模型,监控 PDP 延迟与决策正确率。
3.8 验收标准
| 验收项 | 指标 |
|---|---|
| 审批流权限决策正确率 | ≥ 99.99% |
| PDP 平均响应时间 | < 30ms |
| 属性变更生效延迟 | < 10s |
| 策略热更新可用时长 | 无重启、零宕机 |
| 权限模型可扩展性 | 新增角色/属性无需修改 PDP 核心代码 |
架构决策记录(ADR)示例:场景“跨国审批需区分 A/B 级合同” → 选择 RBAC+ABAC 混合:角色控制“能否审批合同”,属性控制“金额 < 100万为B级可转签,≥100万需A级会签”。