RBAC、ACL、ABAC的介绍、Casbin的使用以及simpleui的使用
RBAC的介绍和使用
RBAC的定义
基于角色的访问控制(Role-Based Access Control
)
权限与角色相关联,用户通过成为适当的角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予给用户,这样的权限设计的很清楚,管理起来很方便
RBAC权限管理的模式,最适合公司内部的管理系统,不适合对外互联网用户的系统
用户:用户表
角色(部门):角色表(部门表)
权限:权限表
由django的权限表可以看出所有的权限都是存在权限表中一条条记录(参考django中auth自带的权限表)
权限是授予角色的(或者说部门,或者说组),一个个角色,就是一条条记录(对应到公司就是开发部,hr部门,股东部)
用户:一个个用户是用户表中一条条记录,用户属于某个部门,就具备了部门下的权限
三张表之间的关系
- 用户和角色关系:多对多,中间表
- 角色和权限关系:多对多,中间表
那么就一共有了5张表
用户表、角色表、权限表、用户和角色关联表、角色和权限关联表
而django内置的权限管理,在RBAC的基础上还加了一个ACL。也就是管理员可以不通过角色直接授予用户权限
所以django中有6张表,也就是用户与权限的关系表
django中的RBAC+ACL表
- auth_user :用户表
- auth_group:角色,组,部门表
- auth_user_groups:用户和角色中间表
- auth_permission:权限表
- auth_user_user_permissions:用户和权限中间表
- auth_group_permissions:角色和权限中间表
之前很多公司写后台管理使用django,做二次开发,就可以不用再写权限了,再此基础上快速夹功能即可。
ACL、RBAC、ABAC(PBAC、CBAC)权限控制的介绍
ACL(Access Control List
:访问控制列表)
将用户或组等使用者直接与对象的权限对接:管理员直接给用户授予某些权限即可
RBAC(Role-Based Access Control
,基于角色的访问控制)
将用户与角色对接,然后角色与对象的权限对接
ABAC(Attribute-Based Access Control
,基于属性的访问控制)
ABAC(Attribute-Based Access Control,基于属性的访问控制),又称为PBAC(Policy-Based Access Control,基于策略的访问控制),或CBAC(Claims-Based Access Control,基于声明的访问控制)
不同于常见的将用户通过某些方式关联到权限的方式,ABAC
则是通过动态计算一个或一组属性来判断是否满足某种条件来进行授权判断(可以编写简单的逻辑)。
属性通常来说分为四类:
- 用户属性(比如用户年龄,用户地址)
- 环境属性(比如当前时间)
- 操作属性(增、删、改、查)
- 对象属性(比如一篇文章,又称资源属性)
特点:
- 集中化管理
- 可以按需求实现不同颗粒度的权限控制
- 不需要预定义判断逻辑,减轻了权限系统的维护成功,特别是在需求经常表的系统重
- 定义权限时,不能直接看出用户和对象间的关系
- 规则如果稍微复杂一点,或者设计混乱,会给管理者维护和追查带来麻烦
- 权限判断需要实时执行,规则过多会导致性能出现问题
传统的ACL架构是
{subject,action,object}
ABAC的架构是
{subject,action,object,contextual},并且为他们添加了parameter(参数)。
subject属性:比如用户的年龄、部门、角色、威望、积分等主题属性
action属性:比如查看、读取、编辑、删除等行为属性
object属性:比如银行账号、文章、评论等对象或资源属性
contextual:比如时段、IP位置、天气等环境熟悉
ABAC将用户权限更加颗粒化,相比与RBAC
Casbin快速实现权限控制
文档地址
使用RBAC实现权限控制伪代码
创建一个py文件,代码演示
# 先导入casbin模块,用go写的
import casbin
sub = "alice" # 想要访问资源的用户
obj = "data1" # 将要被访问的资源
act = "read" # 用户对资源进行的操作
"""
自己写acl的控制
当前用户id,去权限和用户表查询即可,有记录就是有权限
自己写rbac
当前用户id,找到他的角色,根据角色拿出权限,判断当前访问有没有
"""
e = casbin.Enforcer("./basic_model.conf", "./basic_policy.csv")
if e.enforce(sub, obj, act):
# 允许alice读取data1
print('有权限')
else:
# 拒绝请求,抛出异常
print('无权限')
创建一个model文件
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
创建一个Policy文件
p,alice,data1,read
p,bob,data2,write
后台管理simpleui
的介绍和使用
django admin自带了权限控制,但是前后端混合的,我们可以做二次开发,开发出公司内部的自动化运行,自动化测试,人事管理系统,订单系统
地址
功能
对django admin进行美化
使用
下载
pip3 install django-simpleui
注册app
INSTALLED_APPS = [
'simpleui',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
...
]
这样,再登录django-admin后就是美化后的admin管理后台