前言

什么是casbin,Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型。

Casbin可以做到:

  1. 支持自定义请求的格式,默认的请求格式为{subject, object, action}
  2. 具有访问控制模型model和策略policy两个核心概念。
  3. 支持RBAC中的多层角色继承,不止主体可以有角色,资源也可以具有角色。
  4. 支持超级用户,如rootAdministrator,超级用户可以不受授权策略的约束访问任意资源。
  5. 支持多种内置的操作符,如keyMatch,方便对路径式的资源进行管理,如/foo/bar可以映射到/foo*

Casbin不能做到:

  1. 身份认证 authentication(即验证用户的用户名、密码),casbin只负责访问控制。应该有其他专门的组件负责身份认证,然后由casbin进行访问控制,二者是相互配合的关系。
  2. 管理用户列表或角色列表。 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("拒绝")

解释一下,我们通过casbinEnforcer引入,然后定义了三个变量,去通过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还是说别的什么,所以,这一块暂时只能是先搁置了,后续待补。。。