一、Casbin模型基础
1、PERM元模型
subject (sub访问实体),object(obj访问的资源)和action(act访问方法) eft(策略结果 一般为空 默认指定 allow)
(1)Policy策略
p={sub,obj,act,eft}
策略一般存储到数据库,因为有很多策略
p = sub,obj,act
(2)Matchers 匹配规则
Request和Policy的匹配规则
m = r.sub == p.sub && r.act == p.act && r.obj == p.obj
r 请求 p 策略
这时候会把 r 和 p 按照上述描述进行匹配,从而返回匹配结果(eft)如果不定义 会返回 allow 如果 定义过了 会返回我们定义过的那个结果
(3)Request 请求
r = {sub,obj,act}
(4)Effect 影响
他决定我们是否可以放行
e = some(where(p.eft == allow)) 这种情况下我们的一个mathers匹配完成得到了 allow 那么这条请求将被放行
e = some(where(p.eft == allow)) && !some(where(p.eft == deny))
这里的规则是定死的
[request_definition]
r = sub, obj, act //形参 定义参数
[policy_definition]
p = sub, obj, act //形参 策略
[policy_effect]
e = some(where (p.eft == allow)) //我们匹配到最终结果之后,能否通过这个表达式是得到bool值
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act //入参 r和p的对应关系
2、role_definition角色域
g = _,_ 表示以角色为基础 (g = 用户,角色)
g = _,_,_ 表示以域为基础(多商户模式)
[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
Policy
p, alice, data1, read
p, bob, data2, write
p, data2_admin, data2, read //或者alice, data2, read也是可以通过的
p, data2_admin, data2, write
g, alice, data2_admin
Request
alice, data2, read 通过最后一句g(r.sub, p.sub)——> data2_admin, data2, read
g(r.sub, p.sub)是让 r.sub 和 p.sub 通用起来
可以通过
二、多租户模型
[request_definition]r = sub,dom,obj,act
入参(实体,域【商户】,资源,方法)
[policydefinitionp=subdomobiact
权限模型(实体,域【商户】,资源,方法)
[role_definition]g=_,_,_
域匹配规则后面g会说这里意思是g收三个参数(用户,角色,商户)
[policy effect]e=some(where(p.eft==allow))
看看经过下面那些个匹配规则后的返回值是否等于里面那个allow
[matchers]m=g(r.sub,p.sub,r.dom)&&r.dom==p.dom&&r.obj==p.obj&&r.act==p.act
先列出来一个权限定义里面的东西
g.qmteacher,classOne
然后用g做一些解析动作
一般我们会收到前端的入参大概长这样"qm","classOne","/base/api","get"
上面我们定义的g就是我们需要的模型 经过g以后 g已经把我们的入参 qm 解析成了r.sub 为
teacher r.rom 为 classOne 先从这个商户找一下角色 找到就过了 然后用 dom 去匹配然后用一个类
似于这样的请求 去策略里面找teacher,classOne/api/base.get