什么是基于角色访问控制(RBAC)技术?详解rbac权限管理的实现方法

在系统登录模块中,常见这样的问题场景:系统用户有不同的用户身份,不同身份的用户登录进系统后只能看到自己对应权限的功能菜单,系统管理员可以方便对用户进行授权以及取消权限。

实现这样一个功能模块通常使用基于角色的权限访问控制,即RBAC(Role Based Access Control)模型。RBAC模型是实现权限资源管理控制的一个普遍通用的模型。

RBAC简介

基于角色的访问控制(RBAC)是实现软件系统安全策略的一种有效的访问控制方式。其基本思想是,对系统操作的各种权限不是直接授予具体的用户,而是在用户集合与权限集合之间建立一个角色集合。每一种角色对应一组相应的权限。一旦用户被分配了适当的角色后,该用户就拥有此角色的所有操作权限。

注:ACL模型,即访问控制列表,一般是指将用户与权限直接关联起来的权限管理方式。

什么是基于角色访问控制(RBAC)技术?详解rbac权限管理的实现方法

RBAC通过定义角色的权限,并对用户授予某个角色从而来控制用户的权限,实现了用户和权限的逻辑分离(区别于ACL模型),这样做的好处是,不必在每次创建用户时都进行分配权限的操作,只要分配用户相应的角色即可,同样地,要对用户取消权限时,只需要取消用户与角色的关联。通常来讲,角色的权限相对稳定,对角色权限变更比用户权限变更要少得多,所以,RBAC简化了用户的权限管理。

什么是基于角色访问控制(RBAC)技术?详解rbac权限管理的实现方法

资源是指系统中可访问的模块、功能等可分配的权限的集合。

角色是指真实场景中的某一类用户,比如系统管理员、普通员工、部门经理、财务主管等等,通常不同的角色具有不同的权限。角色可以根据需要自由创建,角色总是对应一组资源。

用户是指可访问系统的人,一般每个用户都有唯一的UID识别,用户可以被授予不同角色。

例如,有一个“公告管理”功能,使用者的角色有两种:管理员和普通用户。管理员和普通用户被授予不同权限,管理员拥有该功能模块的所有权限,而普通用户只有部分权限:

什么是基于角色访问控制(RBAC)技术?详解rbac权限管理的实现方法

RBAC有4个模型概念,分别是RBAC0、RBAC1、RBAC2、RBAC3。

  • RBAC0为基础模型,即本文前面介绍的内容。主要有3个元素:用户、角色、权限(资源)。用户与角色、角色与权限之间都是多对多的关系。
  • RBAC1是在RBAC0的基础上,增加了角色间的继承关系。这种继承关系可以是多继承,也可以是单继承。适用于角色之间层次分明,可以给角色分组分层的场景。
  • RBAC2是在RBAC0的基础上,增加了角色间的约束关系。比如互斥约束,同一用户只能分配到一组互斥角色集合中的一个角色;基数约束,一个角色被分配到的用户数量受限,一个用户可拥有的角色数量受限,一个角色可以拥有的权限资源受限;先决条件约束,仅当用户已经拥有某一角色时才能给他分配另一种角色,对于角色来讲当某一角色拥有某些权限的时候才能给该角色分配另一些权限。运行互斥约束,一个用户拥有两个角色,但在运行中不可同时激活这两种角色。
  • RBAC3是RBAC1和RBAC2的组合运用。

可以看到,重点是RBAC基础模型,其他几种主要是对角色这个元素的扩充,以适应特定的业务场景。对于绝大多数场景来说,RBAC基础模型就可以满足。

数据库表

实现一个基于RBAC模型的登录模块功能,一般需要5张基本数据库表,分别是:用户表、资源表(系统模块菜单及功能表)、角色表、用户角色关联表、角色权限表。

本文讲解的示例是基于RBAC基础模型,同时从功能完备性和易于实现方面考虑,给出了7张表。在以上5张表的基础上,增加了用户权限表、功能项常量表。

示例中只给出了各个表的一些主要字段,具体使用可根据需要增减。比如一般常用于审计的create_time、update_time、create_by、update_by等字段。

1、用户表

什么是基于角色访问控制(RBAC)技术?详解rbac权限管理的实现方法

用户表存储可登录系统的账号信息。

  • user_code: 用户登录账号,在表中唯一性约束。本例中user_code字段作为UID标识字段。
  • password:用户登录密码,安全性考虑,一般存储密文。

2、菜单资源表

什么是基于角色访问控制(RBAC)技术?详解rbac权限管理的实现方法

菜单权限表存储系统所有的功能项,包括各级菜单以及与之相对应的操作权限点。这个表反映了系统的全部功能集合,一般由开发人员或运维人员进行维护。

  • menu_code: 菜单项编码,系统内部使用,在表中唯一性约束,标识一个具体的菜单项。菜单项编码可以按照一定的规则编码,比如一级菜单m01、m02,二级菜单m0101、m0102、m0201、……,按照这样的规则,可以根据编码识别出菜单级别。
  • menu_name: 用于在系统界面上展示的菜单项名称。
  • parent:上级菜单标识。比如m0201的上级为m02。
  • url: 菜单项对应的链接地址。
  • icon:菜单项图标对应的链接地址。
  • display_order: 菜单项在系统界面上展示的顺序,SQL查询时,根据该字段order by排序。
  • function_code: 存储某一菜单项对应的全部功能点代码。比如insert;update;query;delete; 功能点代码来自于下文第7个表。

3、角色表

什么是基于角色访问控制(RBAC)技术?详解rbac权限管理的实现方法

角色表存储用户创建的角色。

  • role_code: 角色代码,唯一标识一个角色,在表中有唯一性约束。
  • role_name: 角色名称。

4、角色权限表

什么是基于角色访问控制(RBAC)技术?详解rbac权限管理的实现方法

角色权限表存储角色与权限(资源)的映射关系,多对多关系。

  • role_code:引用自角色表中的role_code字段。
  • menu_code:引用自菜单资源表menu_code字段。
  • function_code:字段内容与菜单资源表function_code字段内容相似。比如菜单资源表该字段内容为insert;update;query;delete,但某个角色不具有对应菜单功能的删除操作,则function_code字段内容为 insert;update;query。

5、用户角色表

什么是基于角色访问控制(RBAC)技术?详解rbac权限管理的实现方法

用户角色表存储用户与角色的映射关系,多对多关系。

  • user_code:引用自用户表user_code字段。
  • role_code:引用自角色表role_code字段。

以上5张表即是RBAC基础模型所必须的表。

6、用户权限表

什么是基于角色访问控制(RBAC)技术?详解rbac权限管理的实现方法

用户权限表存储用户与权限(资源)的映射关系,多对多关系。

增加此表的作用是为了实现一个通用的权限管理功能,既可以通过角色给用户授权,也可以通过给用户直接绑定权限授权。即兼容RBAC模型与ACL模型。

在一些系统中,当存在一人多岗,用户数量较少,但角色数量需要较多,这种情况使用ACL模型更为方便。

  • user_code:引用自用户表user_code字段。
  • menu_code:引用自菜单资源表menu_code字段。
  • function_code:字段内容与菜单资源表function_code字段内容相似。比如菜单资源表该字段内容为insert;update;query;delete,但某个用户不具有对应菜单功能的删除操作,则function_code字段内容为 insert;update;query。

7、功能项常量表

什么是基于角色访问控制(RBAC)技术?详解rbac权限管理的实现方法

功能项常量表存储的内容如下:

什么是基于角色访问控制(RBAC)技术?详解rbac权限管理的实现方法

功能项常量表存储功能点代码与名称的对应信息。主要用于维护上面表中function_code字段功能点对应的功能名称。

  • function_code:具体功能代码,如“新增”代码为insert,“删除”代码为delete。唯一标识一个功能操作,在表中唯一性约束。
  • function_name:功能代码对应的在系统界面展示的功能名称。

上面表中function_code是多个功能点代码用分号(😉拼接起来存储的,具体代码实现时对字符串分割后可以对应此表得到功能点名称。

这样设计是一个小的技巧,以简化功能菜单表存储的内容,以及简化权限与角色、与用户的映射。

实现要点

在理解清楚这些表之后,以下列出几个实现要点。

  • 将系统菜单功能录入菜单表。注意menu_code、function_code的编码规则。
  • 将系统中全部的功能点录入功能项常量表。
  • 实现用户管理,对用户表的单表操作。
  • 实现角色管理,对角色表的单表操作。
  • 实现用户角色设置功能,对用户角色表操作,根据所选择的用户执行先delete后insert数据,在同一数据库事务中处理。
  • 实现角色权限设置功能,对角色权限表操作,根据所选择的角色执行先delete后insert数据,在同一数据库事务中处理。
  • 实现用户权限设置功能,对用户权限表操作,根据所选择的用户执行先delete后insert数据,在同一数据库事务中处理。
  • 在查询用户权限时,要同时查询用户权限以及用户所具有角色的权限,这两者的数据可能存在重复,例如:用户权限表维护了用户A具有“公告管理”的权限,同时用户A具有的角色“普通用户”也具有“公告管理”的权限,此时,在后端接口中去重处理即可。

声明:本文由网站用户维维发表,超梦电商平台仅提供信息存储服务,版权归原作者所有。若发现本站文章存在版权问题,如发现文章、图片等侵权行为,请联系我们删除。

(0)
上一篇 2023年9月5日 11:40:44
下一篇 2023年9月5日 11:44:42

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注