casbin的详细理解过程(附图片理解)(rbac模型)

一、casbin模型

casbin模型又叫PERM模型: subject(sub 访问实体),object(obj访问的资源)和action(act访问方法)eft(策略结果,一般为空 默认指定allow)还可以定义为deny

1)Policy策略 ——— p = {sub, obj, act, eft}

1、策略一般存储到数据库,因为会有很多

2、

[policy_definition] p = sub, obj, act


2)Matchers 匹配规则 Request和Policy的匹配规则

1、

m = r.sub == p.sub && r.act == p.act && r.obj == p.obj

2、r 请求 p 策略

3、这时候会把r和p按照上述描述进行匹配,从而返回匹配结果(eft)如果不定义会返回allow,如果定义过了,会返回我们定义过的那个结果


3)Effect影响

1、它决定我们是否可以放行
e = some(where(p.eft == allow)) 这种情况下我们的一个matches匹配完成,得到了allow那么这条请求将被放行
e = some(where(p.eft == allow)) && !some(where(p.eft == deny))

​ 这里的规定是定死的


4)Requset请求 r = {sub, obj, act}

下面我们图解用法:
请添加图片描述

运行这个run the test,可以发现,为true。因为在第一行,alice有读的操作。(见图一)但是我们将read改为write,返回的就是false。(见图二)

请添加图片描述

(图一)

请添加图片描述

(图二)


二、role_definition 角色域

1)g = _ , _ 表示以角色为基础

请添加图片描述

带角色域匹配,alice可以 == data2_admin使用,alice也可以是他自己

2)g = _ , _ , _ 表示以域为基础(多商户模式)


三、用俗语解释一下上面代码

以角色为基础

[request_definition]

r = sub, obj, act

意思:请求入参(实体,资源,方法)


[policy_definition]

p = sub, obj, act

意思:策略(实体,资源,方法)


[role_definition]

g = _ , _

意思:这个情况下,g写什么都可以,毕竟match里面根本没有涉及到g,不过我们规范一点,按照角色权限,这里的意思是g收到两个参数 g = 用户,角色


[policy_effect]

e = some(where (p.eft == allow))

意思:看看经过下面那些匹配规则后的返回值是否有一条等于里面那个allow

[matchers]

m = r.sub == p.sub && ParamsMatch(r.obj, p.obj) && r.act == p.act

意思:进来的实体,资源,方法,能不能在权限表(p)里面找到一个一模一样的


四、多租户模型

[request_definition] r = sub, dom, obj, act

意思:入参(实体,域【商户】,资源,方法)

[policy_definition] p = sub, dom, obj, act

意思:权限模型(实体,域【商户】,资源,方法)

[role_definition] g = _ , _ , _

意思:域匹配规则,后面g会说,这里意思是g收三个参数

[matchers] m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.act

请添加图片描述

先列出来一个权限定义里面的东西

g, qm, teacher, classOne

然后用g做一些解析动作

一般我们会收到前端的入参, 大概是这个样子:“qm",“classOne”,“/base/api/”,“get”

上面我们定义的g就是我们需要的模型,经过g以后,g已经把我们的入参 qm 解析成了 r.sub 为 teacher r.rom 为classone先从这个商户找一下角色,找到就过了,然后用dom去匹配,然后用一个类似于这样的请求,去策略里面找teacher,classOne, /api/base,get

请添加图片描述

四、练习测试

1、在ACL模型中,下列案例可以通过吗

请添加图片描述

答案:false,根本找不到


2、在RBAC模型中,下列案例是否可以通过?

请添加图片描述

答案:true

那假如在添加一条:bob,data2,write可以通过吗?

答案:true,因为bob,data2,write本身就有这一条操作

再添加一条记录,如下图所示

请添加图片描述


3、多商户模型

请添加图片描述

在这个案例中,alice和domain2找到了admin,但是,domain2找不到data1,所以是false

对于g的理解:g:人-组-域,区别看,人可以进多个组多个域,但是data1/data2有不同权限来判断

你想要了解有关权限管理的演示,使用的是基于角色的访问控制(RBAC)和 Casbin 的解决方案。Casbin 是一个强大的授权库,它提供了灵活的访问控制模型和规则引擎。下面是一个简单的 RBACCasbin 的权限管理演示: 1. 安装 Casbin: ``` pip install casbin ``` 2. 创建一个示例访问控制模型(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 ``` 3. 创建一个权限管理策略文件(policy.csv),定义了角色与资源的访问权限: ``` p, alice, data1, read p, bob, data2, write g, alice, admin ``` 4. 在 Python 中使用 Casbin 进行权限验证: ```python from casbin import Enforcer # 加载访问控制模型和策略文件 enforcer = Enforcer("model.conf", "policy.csv") # 验证用户的访问权限 if enforcer.enforce("alice", "data1", "read"): print("alice 有读取 data1 的权限") else: print("alice 没有读取 data1 的权限") if enforcer.enforce("bob", "data2", "write"): print("bob 有写入 data2 的权限") else: print("bob 没有写入 data2 的权限") ``` 这只是一个简单的 RBACCasbin 的权限管理演示,你可以根据实际需求自定义更复杂的访问控制模型和策略。希望这个演示对你有帮助!如果你对 Casbin 想要了解更多信息,可以参考官方文档:https://casbin.org/
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值