4、权限模型基础:RBAC、ABAC模型简介,以及在网关中的映射关系

权限模型是权限审计网关的核心决策依据。在生产环境中,网关需要根据请求携带的身份与上下文,快速判定“谁(Who)能否对什么(What)执行什么操作(Action)”。本章聚焦两种主流模型——RBAC(基于角色的访问控制)与ABAC(基于属性的访问控制),并阐述它们在网关中的映射落地方式。

4.1 RBAC 模型:角色驱动的权限管理

RBAC 将权限授予“角色”,再将角色授予“用户”。用户通过角色间接获得权限,简化了权限分配与回收。

核心概念 说明 网关映射示例
用户(User) 访问系统的实体,如 API 调用方 JWT 中的 sub 或 client_id
角色(Role) 权限的集合,如 admin、editor、viewer JWT 中的 role 声明
权限(Permission) 对资源的操作许可,如 read:order 网关策略中的 action + resource 规则
会话(Session) 用户激活的角色集合 请求上下文中的角色列表
网关实践要点:RBAC 在网关层通常通过 JWT 中的 roles 数组传递。网关从 Token 中提取角色,与预加载的策略缓存进行匹配,无需每次回源查询用户-角色关系,延迟可控制在 1ms 以内。

4.2 ABAC 模型:属性驱动的动态决策

ABAC 使用任意数量的属性(用户属性、资源属性、环境属性、操作属性)组合成策略,支持细粒度、上下文敏感的访问控制。

属性类别 常见属性 网关映射示例
用户属性 部门、职级、安全等级、IP 段 从 JWT 或请求头提取
资源属性 资源类型、所属项目、数据敏感度 从请求路径、参数或元数据服务获取
环境属性 访问时间、地理位置、设备指纹 从请求上下文或网关插件采集
操作属性 HTTP 方法、API 版本、请求频率 从请求行或网关统计模块获取
性能风险提示:ABAC 策略引擎需要在每次请求时评估多个属性组合,计算复杂度高于 RBAC。网关层应使用预编译的策略表达式(如 CEL、Rego)和属性缓存,避免在热路径上执行字符串解析或远程属性查询。

4.3 RBAC 与 ABAC 对比

维度 RBAC ABAC
粒度 粗粒度,基于角色 细粒度,基于属性组合
灵活性 低,角色变更需管理员操作 高,策略可动态调整
管理成本 低,角色数量有限 高,属性与策略数量可能爆炸
性能 高,仅需查表匹配 中等,需属性解析与表达式求值
适用场景 组织层级稳定、权限变化少 多租户、数据级权限、合规审计

4.4 网关中的映射关系

权限审计网关作为统一入口,需要将 RBAC 和 ABAC 模型映射为可执行的策略规则。下图展示了两种模型在网关请求处理流程中的映射位置。

权限模型在网关中的映射关系 RBAC 映射 JWT 提取 roles 策略缓存匹配 角色 → 权限集合映射表 (admin → read,write,delete) 决策输出:允许/拒绝 匹配即放行,不匹配即拒绝 ABAC 映射 属性收集器 策略引擎 属性上下文构建 (user.dept + resource.project + time) 策略表达式求值 (CEL/Rego 规则引擎) 网关通常采用 RBAC + ABAC 混合策略:RBAC 做第一层粗筛,ABAC 做第二层细粒度裁决

4.5 网关中的策略数据结构

在 Go 网关中,权限策略通常以结构化配置存储。以下是一个同时支持 RBAC 和 ABAC 的策略定义示例:

// Policy 定义网关权限策略
type Policy struct {
    ID          string            `json:"id" yaml:"id"`
    Description string            `json:"description" yaml:"description"`
    // RBAC 字段:匹配角色
    Roles       []string          `json:"roles,omitempty" yaml:"roles,omitempty"`
    // ABAC 字段:匹配属性表达式
    Conditions  []Condition       `json:"conditions,omitempty" yaml:"conditions,omitempty"`
    // 资源与操作
    Resources   []string          `json:"resources" yaml:"resources"`
    Actions     []string          `json:"actions" yaml:"actions"`
    Effect      string            `json:"effect" yaml:"effect"` // allow / deny
}

// Condition 定义 ABAC 属性条件
type Condition struct {
    Attribute string `json:"attribute" yaml:"attribute"` // 如 user.dept
    Operator  string `json:"operator" yaml:"operator"`   // eq, neq, in, contains
    Value     string `json:"value" yaml:"value"`         // 如 "engineering"
}
映射规则总结:
  • RBAC 映射:网关从 JWT 中提取 roles → 匹配策略中的 Roles 列表 → 命中则检查 Resources 与 Actions。
  • ABAC 映射:网关构建属性上下文(用户、资源、环境) → 对策略中的 Conditions 逐条求值 → 全部通过则放行。
  • 混合模式:策略可同时包含 Roles 和 Conditions,网关先校验角色,再校验属性条件,实现分层控制。

4.6 网关权限决策流程

以下 SVG 展示了网关在一次请求中执行 RBAC + ABAC 混合决策的完整流程。

网关权限决策流程(RBAC + ABAC 混合) 收到 API 请求 1. 解析 JWT,提取 roles 2. RBAC 角色匹配 匹配? 拒绝 3. ABAC 属性条件求值 通过? 拒绝 放行
性能优化建议:对于纯 RBAC 策略,网关可在启动时构建 map[role]map[resource][]action 哈希表,实现 O(1) 匹配。对于 ABAC 策略,建议将常用属性(如部门、项目)预提取到请求上下文,避免在策略引擎中重复解析。