当前位置:网站首页>权限管理模型 ---- ACL、RBAC和ABAC(详解)
权限管理模型 ---- ACL、RBAC和ABAC(详解)
2022-08-09 08:30:00 【我是一把小菜刀】
前言
在管理系统中会涉及到很多用户权限相关问题,对于不同的平台所使用的的权限管理模型也是多样的。
ACL 基于用户的权限管理模型
基于用户的概念就是说直接对用户进行权限分配管理,好处是模型构建简单,只需要给用户授予或者取消对应权限即可。但是相对的,如果用户数量庞大的情况下,这套模型就很不实用。因为需要对每一位用户对应权限进行维护,这导致维护成本太高。
ACL模型表结构很简单,只需要用户user表和权限节点node以及user和node的多对多关系表user_node。同时,只需要维护user_node表中user和node关系即可。
ACL的适用于用户数量较小的管理系统中,例如:2112班有10位同学,张三拥有班长权限、李四拥有学委权限、王五拥有纪委权限,其它同学只拥有普通权限。
RBAC 基于角色的权限管理模型
角色的概念就是对用户的一个升级,管理者不需要考虑用户和权限关系。只需要给用户某种角色,然后对角色授予或者取消对应权限。模型构建相对复杂,但是在用户数量大的情况下,还是需要维护角色和权限关系,以及用户和角色关系。
RBAC的表结构包括,用户user表、角色role表、权限节点node表和用户user和角色role多对多关系的user_role表及角色role和节点多对多关系的role_node表,共5张表。
ABAC 基于属性的权限管理模型
ABAC对用户本身的属性进行标识,通过标识来判断用户权限。这样的设计使得ABAC非常灵活,可扩展性也很高。
ABAC一般来说,都是搭配着ACL或RBAC一起使用,不会单独成体系。在设计中,只需要在user表中加入对应字段即可,例如:某平台只允许15到50岁之间的用户注册,那么需要在user表中加入age字段。
分析
这三种权限管理模型,也可以说是设计理念;在web后端的开发中都是以用户为主体,构建起来都较为简单。当然,它们各自都有优缺,只是两权相难取其轻,具体开发过程中还需要权衡开发成本而选择。
利用二进制优化
利用二进制数字以及二进制位运算的特点,来匹配权限管理模型。
二进制中的0和1分别可以代表有权限(True)和没权限(False)两种状态。
位与操作:两个二进制数字相与得到一个新数,python中用&表示。例如:0b101 & 0b010 结果为0 0b110 & 0b101 结果为0b100,也就是得到的这个新数,如果位置相同的数的值也相同那么结果为1,反之为0。
位或操作:就是两个二进制数字位或得到一个新数,python中用 | 表示。例如:0b101 | 0b010 结果为 0b111,0b110 | 0b100 结果为0b110。也就是得到的这个新数,如果位置相同的数的值都为0,则新数的相同位置值为0,反之都为1。
那么,我们可以用位与操作来判断用户是否拥有某一权限:权限一表示为0b001,权限二表示为0b010,那么有一用户拥有权限为0b110就可以解读为,该用户拥有权限二和权限三。同时,将该用户拥有的权限和权限一对应的二进制数相与,结果不为0,则说明该用户有权限一,其它同理。
位或操作可以来给用户/角色赋予某一权限:权限一表示为0b001,权限二表示为0b010,如果初始状态用户是没有权限的,也就是0b000。但是,0b000 | 0b001 结果为0b001,再 0b001 | 0b010 结果为 0b011,那么该用户就拥有了权限一和二。
总结
利用二进制优化的好处是可以省去用户和权限之间的关系表,只需要在用户表添加字段就可以,同样的如果是RBAC,角色和权限关系,用户和角色关系都可以这样用。同时这样做的优点是二进制的运算快、性能高,也能减少很多连表查询次数。但是同样的,没有完美的设计,这样做无疑会导致可读性很差,使得维护起来比较难搞。
边栏推荐
- 【MySQL】mysql:解决[Err] 1093 - You can‘t specify target table ‘表名‘ for update in FROM clause问题
- leetcode 32. 最长有效括号 (困难)
- Shell之函数与数组
- web basic concepts
- matlab——解线性方程组 与 非线性方程组
- Programming a washing machine: garbled characters after string output
- LAN技术-6MSTP
- get一个小技巧,教你如何在typora写文章上传图片到博客上
- 正则表达式基础介绍
- 204. Count Primes
猜你喜欢
随机推荐
深度学习时代的视频理解综述
I'm here to advertise
Introduction to the Endpoint
Shell编程之正则表达式
测试和开发之间的恩恩怨怨
App testing
leetcode 33. 搜索旋转排序数组 (二分经典题)
Programming a washing machine: garbled characters after string output
Jmeter连接Mysql和Mysql编码问题
文件处理(IO)
System Security and Application
数制转换及子网划分
pip3换源提升速度
交换机的工作原理
Win10电脑的WLAN消失的故事
nyoj306 走迷宫(搜索+二分)
Use of prepareStatement
Processes and Scheduled Tasks
Xpath之爬取全国城市名称学习
requests之模拟登录学习