一、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有不同权限来判断