### RBAC0:最基础的权限骨架 说起RBAC,得从它的核心骨架讲起。NIST在2004年发布的那套标准里,定义了四个层级的RBAC模型:从0到3,逐级叠加能力。本章我们先啃最基础的——RBAC0。 RBAC0是所有权限系统的起点。说白了,它就是一套“用户-角色-权限”的三层映射关系。我们接下来把它拆开,看看每层到底在做什么。 #### 三大核心组成 我个人习惯用一个简单的三段论来理解RBAC0: - **用户(User)**:系统的访问主体。可能是人,也可能是程序。 - **角色(Role)**:一个抽象的权限集合。它代表的是一种职责或职能,而不是具体某个人。 - **权限(Permission)**:对某个资源的访问许可。在密钥管理场景里,可能是“生成密钥”、“查看密钥状态”、“导出密钥”这类原子操作。 这三者之间只能通过“角色”这座桥来连接。为什么这么设计? #### 两个核心映射才是关键 你想想看,传统的访问控制模型,比如DAC或MAC,都是把权限直接挂到用户头上。那时候管理起来特别痛苦——员工离职或调岗,你得到处改权限,改到怀疑人生。 RBAC0的思路巧妙在哪呢?它把问题拆成了两个映射: 1. **用户-角色分配(User-Role Assignment)**:给用户分配角色。 2. **角色-权限分配(Role-Permission Assignment)**:给角色分配权限。 **这样做的好处**:用户和权限之间不再直接耦合。当员工调岗时,你只需要把他从一个角色挪到另一个角色,他之前那个角色的所有权限就会自动消失——完全不用逐个检查之前的权限列表。我在项目里体验过这个好处,真的太省心了。 #### 表结构的设计 从数据库层面看,实现RBAC0通常需要这几张表。我列个表,方便你对照理解: | 表名 | 核心字段 | 作用 | | --- | --- | --- | | `user` | user_id, username, ... | 存储用户基本信息 | | `role` | role_id, role_name, description | 定义所有角色 | | `permission` | perm_id, perm_code, perm_desc | 定义权限原子项 | | `user_role` | user_id, role_id | 建立用户与角色的多对多关系 | | `role_permission` | role_id, perm_id | 建立角色与权限的多对多关系 | 表中没有“用户-权限”这个直接映射。这就是RBAC0的精髓。 #### 会话(Session)的概念 RBAC0还引入了一个容易被忽略的概念——**会话**。 会话是用户的一次活跃连接。用户登录后,系统会创建一个会话,并激活该用户在本次会话中的角色子集。用户可能有多个角色,但一次会话只激活其中一部分。 举个例子: - 小张在密钥管理系统里有“管理员”和“审计员”两个角色。 - 他处理日常工作时,激活“审计员”角色,只能查看日志,不能修改密钥。 - 他需要进行密钥分发任务时,再激活“管理员”角色获取操作权限。 这个设计实际上实现了**最小权限原则**——用户永远只持有当前任务需要的权限。 #### 我在项目中踩过的坑 讲个真实案例。曾经有一个金融项目,我直接按业务部门名称设计了角色,比如“信贷部角色”、“结算部角色”。上线后问题就来了——一个员工在信贷部和结算部都挂着,他的权限交叉重叠,审计时根本说不清楚这个人的权限来源。 后来我悟了:角色的命名应该反映的是**能力**,而不是**部门**。比如“密钥生成员”、“密钥审批员”、“密钥审计员”。这样即使一个员工属于两个部门,他的权限边界也很清晰。 #### RBAC0的约束 RBAC0本身不强制任何约束,比如一个用户能不能有多个角色?可以。一个角色能不能有多个父角色?不行,那是RBAC1的层级模型。所以RBAC0被称为“基本模型”是有原因的——它只规定了最基础的要素,把复杂性留给了后面的层级。 #### 一张图看清RBAC0 理解了吗?这个架构的核心就是把“谁有什么权限”这个问题转化为“谁是什么角色,这个角色有什么权限”,解耦了用户与权限的直接绑定。 #### 实战总结 总结一下,构建RBAC0权限系统时,我建议你记住三条原则: 1. **角色要抽象**。别把角色设计成具体的人名或工号,要设计成职责集合。 2. **权限要细粒度**。比如“查看密钥”和“导出密钥”应该分开,而不是写成一个“密钥管理”。 3. **会话管理别忽略**。多角色用户的会话激活机制是实现最小权限的关键。 RBAC0虽然是最基础的模型,但90%的企业级系统用它就够了。我在多个密钥管理项目里都用这套模型,几乎没有遇到无法覆盖的场景。下一层我们再看RBAC1怎么加层级概念——那是更深的话题了。