前言
什么是casbin,Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型。
Casbin可以做到:
- 支持自定义请求的格式,默认的请求格式为
{subject, object, action}
。 - 具有访问控制模型model和策略policy两个核心概念。
- 支持RBAC中的多层角色继承,不止主体可以有角色,资源也可以具有角色。
- 支持超级用户,如
root
或Administrator
,超级用户可以不受授权策略的约束访问任意资源。 - 支持多种内置的操作符,如
keyMatch
,方便对路径式的资源进行管理,如/foo/bar
可以映射到/foo*
Casbin不能做到:
- 身份认证 authentication(即验证用户的用户名、密码),casbin只负责访问控制。应该有其他专门的组件负责身份认证,然后由casbin进行访问控制,二者是相互配合的关系。
- 管理用户列表或角色列表。 Casbin 认为由项目自身来管理用户、角色列表更为合适, 用户通常有他们的密码,但是 Casbin 的设计思想并不是把它作为一个存储密码的容器。 而是存储RBAC方案中用户和角色之间的映射关系。
安装
python使用casbin需要安装,命令是
pip install casbin
教程
在 Casbin 中, 访问控制模型被抽象为基于PERM(Policy(策略), Effect(效果), Request(请求), Matcher(匹配器))的一个文件。 因此,切换或升级项目的授权机制与修改配置一样简单。 您可以通过组合可用的模型来定制您自己的访问控制模型。 例如,您可以在一个model中获得RBAC角色和ABAC属性,并共享一组policy规则。
比如说,我们定义一个model.conf
来实现ACL模型
# 请求定义
[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
⚠!这里注重说一下匹配器,这代表了你的匹配规则,比如现在这个例子,只有请求(r)和定义的策略(p)完全一致,才可以被认可。
ACL模型的示例,我们创建一个policy.csv
:
p, alice, data1, read
p, bob, data2, write
这表示,alice可以读取data1,bob可以编写data2
然后我们在同级目录下测试,新建一个py文件
import casbin
e = casbin.Enforcer("./model.conf", "./policy.csv")
# 你的请求
sub = "alice"
obj = "data1"
act = "read"
if e.enforce(sub, obj, act):
print('通过')
else:
print("拒绝")
解释一下,我们通过
casbin
的Enforcer
引入,然后定义了三个变量,去通过enforce
验证他们,这也就代表了,他们会去policy.csv
去查找策略,然后通过匹配器来进行匹配,如果通过了,他将会为你返回一个casbin
,这是个布尔值。
RBAC
我们再来演示一下RBAC
,首先需要在model.conf
中更改一下策略,新增加一个role_definition
,然后更改一下匹配器的策略。所以,你的model.conf
看起来像是这样
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[role_definition]
g = _,_
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub,p.sub) && r.obj == p.obj && r.act == p.act
Casbin 支持 RBAC 系统的多个实例, 例如, 用户可以具有角色及其继承关系, 资源也可以具有角色及其继承关系。 这两个 RBAC 系统不会互相干扰。
此部分是可选的。 如果在模型中不使用 RBAC 角色, 则省略此部分。
_, _
表示角色继承关系的前项和后项,即前项继承后项角色的权限。
然后,我们在policy.csv
中重新定义我们的策略。
p, superuser, data1, all
g, alice, superuser
首先,就是superuser有对data1资源的所有操作,而,alice的角色正好是superuser
ok,那让我们回到py文件
首先,实例化这块没有什么改变,我们首先验证一下,你输入的用户是否有角色了。我们使用has_role_for_user
import casbin
dd = casbin.Enforcer("./model.conf", "./policy.csv")
sub = "alice"
obj = "data1"
act = "all"
a = dd.has_role_for_user(sub,'superuser')
print(a)
返回的是一个布尔值,这是我们在policy.csv
定w的alice是superuser。
如果说,你想要为这个用户添加角色,则可以使用add_role_for_user
,如果用户已经有该角色了,则返回false,这一块还没有太了解是会更改policy.csv还是说别的什么,所以,这一块暂时只能是先搁置了,后续待补。。。
- Post link: https://www.godhearing.cn/casbin/
- Copyright Notice: All articles in this blog are licensed under unless otherwise stated.