RBAC(Role-Based Access Control)基于角色的访问控制。权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。

核心三元组

  • Who:权限的拥有者或主体(User,Role)
  • What:操作或对象(Operation,Object)
  • How:具体的权限(Privilege,正向授权与负向授权)

四种模型

  • RBAC0:RBAC 的核心思想,最基础
  • RBAC1:在 RBAC0 基础上增加了角色分层模型
  • RBAC2:在 RBAC0 基础上增加了约束模型(如互斥角色)
  • RBAC3:RBAC1 + RBAC2,即完整模型

表设计

典型的 RBAC 表结构:

  • 用户表(user):用户基本信息
  • 角色表(role):角色信息
  • 权限表(permission):权限信息
  • 用户角色关联表(user_role):用户与角色的多对多关系
  • 角色权限关联表(role_permission):角色与权限的多对多关系

业务结合

在实际权限系统中,完全遵循 RBAC 模型很难,因为业务差异化考量会导致系统无法扩展。

设计建议:RBAC 是一种模型和思想,不是要完全参照,而是在这个基础之上融入自己的思想和业务。

权限判断流程

以 Shiro 为例:

  1. 权限赋予:当前用户的权限可分配给下级角色,但下级角色权限 ≤ 当前用户权限
  2. 权限加载:用户登录后,第一次使用权限判断时加载权限
  3. 权限判断:走正常用户权限判断,数据操作需判断归属用户(业务层逻辑)
  4. 禁用/启用:添加到禁用列表,被禁用用户无法操作任何内容

不要让框框架架限制业务,也不要让业务局限于框框架架。基于框架做业务封装。