1. 权限模型概述

1.1 访问控制基本概念

访问控制(Access Control)是信息安全体系的核心机制,其本质是“谁(主体)能对什么(客体)执行哪些操作(动作)”。在软件系统中,访问控制决定了用户能否读取某个文件、调用某个API、修改某条数据库记录。

访问控制的三要素:

  • 主体(Subject):发起访问请求的实体,如用户、进程、服务账号。
  • 客体(Object):被访问的资源,如文件、API端点、数据库表、微服务。
  • 操作(Operation):主体对客体执行的动作,如读、写、执行、删除。

访问控制策略通常围绕三个核心问题展开:

  1. 认证(Authentication):确认主体身份是否真实。
  2. 授权(Authorization):确认主体是否有权执行请求的操作。
  3. 审计(Audit):记录访问行为,用于事后追溯与合规检查。
合规视角: 在GDPR、SOX、PCI-DSS等合规框架中,访问控制是强制性要求。例如,PCI-DSS要求“按需分配最小权限”,SOX要求“职责分离(SoD)”,这些都需要权限模型在架构层面提供支撑。

1.2 权限模型演进历史

权限模型的发展经历了从粗粒度到细粒度、从静态到动态的演进过程:

阶段 模型 核心思想 典型问题
1960s DAC(自主访问控制) 资源所有者自行决定谁可以访问 权限扩散失控,无法集中管理
1970s MAC(强制访问控制) 系统根据安全标签强制控制 灵活性差,不适合业务系统
1990s RBAC(基于角色的访问控制) 权限与角色绑定,用户通过角色获得权限 角色爆炸,细粒度不足
2000s ABAC(基于属性的访问控制) 根据主体、资源、环境属性动态决策 策略复杂,性能开销大
2010s至今 RBAC+ABAC混合模型 角色粗粒度管控,属性细粒度补充 设计复杂度高,需合理划分边界
演进趋势: 从“谁”到“什么条件下”的转变。DAC/MAC关注“你是谁”,RBAC关注“你的角色是什么”,ABAC关注“你的属性+环境+资源属性综合判断”。混合模型则是在角色基础上叠加属性条件,兼顾效率与灵活性。

1.3 RBAC与ABAC核心区别

RBAC和ABAC是当前最主流的两种权限模型,它们在设计哲学、决策方式、适用场景上存在本质差异:

对比维度 RBAC(基于角色) ABAC(基于属性)
决策依据 用户所属的角色 主体属性 + 资源属性 + 环境属性
权限粒度 粗粒度(角色级别) 细粒度(属性级别)
策略变更 需修改角色-权限映射 修改策略规则即可,无需改角色
性能 高(预计算,缓存友好) 中低(运行时计算属性)
管理复杂度 低(角色数量可控时) 高(属性与策略规则多)
典型场景 企业ERP、CRM、OA系统 云资源管理、数据脱敏、多租户

RBAC的核心公式:

用户 → 角色 → 权限
// 用户通过角色间接获得权限
// 角色是权限的集合

ABAC的核心公式:

访问决策 = f(主体属性, 资源属性, 环境属性, 操作)
// 决策引擎根据策略规则计算布尔结果
// 示例:允许访问 if 用户.部门 == 文档.部门 AND 当前时间 in [09:00, 18:00]
常见误区: 不要认为ABAC可以完全替代RBAC。在大多数企业系统中,纯ABAC会导致策略规则爆炸、运维人员难以理解、性能瓶颈。混合模型才是工程实践中的最优解。

1.4 混合模型适用场景

RBAC与ABAC混合模型的核心思想是:用RBAC做粗粒度的权限骨架,用ABAC做细粒度的权限血肉。具体来说:

  • RBAC层:定义角色(如管理员、审计员、普通员工),角色绑定模块级别的访问权限(如“访问财务模块”、“查看用户列表”)。
  • ABAC层:在角色基础上叠加属性条件,实现数据级别的细粒度控制(如“只能查看本部门的财务数据”、“只能操作状态为‘草稿’的订单”)。

典型适用场景:

场景 RBAC负责 ABAC负责
多租户SaaS 租户管理员、普通用户角色 只能访问本租户数据(租户ID属性)
医疗信息系统 医生、护士、药剂师角色 只能查看自己负责患者的病历(患者-医生关联属性)
金融风控系统 风控审核员、风控主管角色 审核金额超过100万需主管二次审批(金额属性+审批状态)
内容管理系统 编辑、作者、审核员角色 只能编辑自己创建的文章(创建者属性)
混合模型决策流程: 当用户发起请求时,系统先通过RBAC判断用户角色是否具备模块访问权限;如果通过,再通过ABAC引擎根据属性规则判断是否允许具体操作。这种“先粗后细”的决策链既能保证性能,又能实现灵活控制。
RBAC + ABAC 混合模型架构 用户 RBAC 角色检查 用户 → 角色 → 模块权限 拒绝访问 ABAC 属性策略引擎 主体属性 + 资源属性 + 环境属性 → 策略规则计算 允许 / 拒绝 先粗后细:RBAC过滤模块级 ABAC控制数据级权限 性能优化:RBAC缓存角色 ABAC仅对通过RBAC的请求计算

上图展示了混合模型的典型决策流程:用户请求先经过RBAC层进行角色检查,只有通过角色权限验证的请求才会进入ABAC层进行属性策略计算,最终输出允许或拒绝的决策。这种分层设计有效避免了ABAC引擎处理大量无关请求的性能问题。

架构建议: 在实现混合模型时,建议将RBAC决策缓存到Redis等内存存储中(角色变更频率低),ABAC策略规则使用表达式引擎(如Spring EL、Drools)动态解析。这样既能保证RBAC的高性能,又能保持ABAC的灵活性。