【表设计】权鉴模型设计

目录

  • 引言
  • RBAC
    • RBAC模型
    • RBAC存在的问题与解决方案
  • ABAC
    • ABAC模型
  • 推荐阅读

引言

系统安全六要素中的认证、授权、凭证常关联起来形成权鉴,用于支撑系统安全。
今天,我们一起来深入了解权鉴系统的常见模型,RBAC与ABAC。看看这两种模型是怎么设计的,它们又解决了什么样的问题。

本篇相较于其他文章,对于RBAC的总结更为精炼。

RBAC

RBAC是很常见的权鉴模型设计,其将认证->授权->凭证中的权限概念绑定到“角色”上,让权限与用户解耦,做权限的统一管理,在设计上是树形结构。

RBAC模型

RBAC模型基于以下核心实体:

  • 用户(User): 系统中的个体或实体(如员工、管理员)。
    基础结构:user_id,user_name

  • 角色(Role): 一组权限的集合,代表特定职责(如管理员、编辑者、访客)。
    基础结构:role_id,role_name

  • 权限(Permission): 对特定资源执行的操作(如读取、写入、删除)。
    基础结构:permission_id,permission_name,resource_name,action

  • 资源(Resource): 系统中的对象(如文件、页面、API端点)。
    基础结构:resource_id,resource_name

  • 分配(Assignment): 用户与角色的关联(user_role)、角色与权限的关联(role_permission)。
    user_role基础结构:user_id,role_id
    role_permission基础结构:role_id,permission_id

其中权限与资源的绑定也可以在应用层处理,例如通过注解形式要求操作必须具备某某权限。
(小系统可以在应用层处理做到极简化。)

生产级RBAC系统应包含以下功能:

  • 用户管理: 添加、编辑、删除用户,分配角色。

  • 角色管理: 创建、修改、删除角色,分配权限。
    在企业内部系统中,可以同步继承角色来减少重复配置。例如部门主管自动继承基础审批权限,再根据部门特性添加额外权限。
    例如角色继承表(Role_Hierarchy),记录角色继承关系,视情况权衡是否允许多继承关系。
    role_hierarchy基础结构:parent_role_id,child_role_id

  • 权限管理: 定义资源和操作,分配给角色。
    一些时候,可以通过定时任务预计算用户权限,提升鉴权效率。即使用缓存中间表——user_permission。

  • 权限检查: 在API或页面访问时,验证用户是否具有所需权限。

  • 审计日志: 记录权限变更和访问操作,满足合规性要求。

  • 动态扩展: 支持多租户、域隔离(如不同部门)或细粒度权限。

RBAC存在的问题与解决方案

  • 角色爆炸
    当权限分的越来越细,基于角色的RBAC模型所需要设计的角色就会越来越多,从而导致管理复杂,权限分配混乱的问题,即“角色爆炸”。

解决方案:角色分类(如按项目、业务领域划分)、合并(如相同权限的角色合并为一个,如店长),动态角色生成(依据用户属性生成,如用户部门+用户职级=生成角色P5、M2等)

  • 水平权限问题
    RBAC是基于角色权限的,无法做到按用户权限,例如用户应该只看到自己的购物车、收藏清单。
    RBAC是无法满足细粒度的需求的,仅RBAC会出现水平越权问题。

解决方案:在RBAC基础上叠加属性条件,如user_id、dep_id来划分;或引入资源权限表,单独管理资源级别的权限,如order_permission表记录用户与订单的绑定关系。

ABAC

ABAC是基于属性的权限模型,较RBAC可以做到更细粒度的权限控制。ABAC的思想是基于用户、以及将要访问的数据的属性、以及各种环境因素去动态计算用户是否有权限进行操作。
但是因为需要根据属性计算权限来访问资源,其较RBAC也更复杂。

ABAC模型

一个典型的 ABAC 模型包含以下四个关键部分,它们的属性共同决定了访问决策:

  1. 主体 (Subject) / 用户属性:

    • 描述在请求访问。
    • 例子: 用户 ID、角色(虽然是属性之一,但不是唯一决定因素)、部门、安全许可级别、国籍、年龄、职位、所属项目组等。
  2. 资源 (Resource) / 对象属性:

    • 描述什么被请求访问。
    • 例子: 文件类型(如 “财务报告”)、数据敏感度级别(如 “公开”、“内部”、“机密”)、文档所有者、项目代码、地理位置、创建日期、资源所在的部门等。
  3. 操作 (Action) 属性:

    • 描述请求者试图对资源执行的动作
    • 例子: 读取 (Read)、写入 (Write)、编辑 (Edit)、删除 (Delete)、复制 (Copy)、批准 (Approve)、执行 (Execute) 等。
  4. 环境 (Environment) / 上下文属性:

    • 描述访问发生的环境条件或上下文。这是 ABAC 相比 RBAC 的一个显著优势。
    • 例子: 访问时间(如 “工作时间内”、“非工作时间”)、访问地点(如 “公司内网”、“公网 IP”)、设备安全状态(如 “受信任设备”、“越狱设备”)、当前系统威胁级别、访问请求的来源网络、认证强度(如 “单因素认证”、“多因素认证”)等。

推荐阅读

https://juejin.cn/post/6941734947551969288#heading-5

你可能感兴趣的:(#,数据库表设计,RABC)