1. PERM原模型
定义一个策略,定义一个匹配规则,通过请求参数与策略通过规则进行匹配,获得一个eft影响,拿到影响的结果,进到影响的表达式,返回一个布尔值。
1.1 基本参数
- subject(sub访问实体)
- object(obj访问的资源)
- action(act访问方法)
- eft(策略结果,一般为空,默认指定allow,还可以定义为deny,是硬编码写死,只能是这两个值)
1.2 模型介绍
-
Policy 策略 p={sub,obj,act,eft}
- 策略一般存放在数据库,因为会有很多
-
Effect 影响
- 他决定我们是否可以放行
- e = some(where(p.eft == allow)) 这种情况下,我们的一个matchers匹配完成得到了allow那么这条请求将被放行
- e = some(where(p.eft == allow)) && !some(where(p.eft == deny))
- 这里的规则是定死的
- some(where (p.eft == allow)) 能返回来一条allow的
- !some(where (p.eft == deny)) 没有一条是deny的
- some(where (p.eft == allow)) && !some(where (p.eft == deny)) 能返回allow并且没有阻止的
- priority(p.eft) || deny
-
Request 请求 r={sub,obj,act}
-
Matchers 匹配规则 Request和Policy的匹配规则
- m = r.sub == p.sub && r.act == p.act && r.obj == p.obj
- r 请求 p策略
- 这时候会把r和p按照上述描述进行匹配,从而返回匹配的结果(eft)如果不定义,会返回allow,如果定义过了,返回我们定义过的结果
- 只有满足了匹配规则,才会返回eft
-
role_defintion 角色域
- g = _, _ 表示以角色为基础
g = user,role
表示用户是哪个角色 - g = _, _, _ 表示以域为基础(多商户模式)
g = user,role, _
表示这个角色是哪个角色属于哪个域(哪个商户)
- g = _, _ 表示以角色为基础
1.3 样例
请求入参(实体,资源,方法)
[request_definition]
r = sub, obj, act
策略(实体,资源,方法)
[policy_definition]
p = sub, obj, act
/*
角色(用户,角色)
[role_definition]
g=_, _
*/
经过策略通过规则匹配规则后的策略结果是否等于里面那个allow
[policy_effect]
e = some(where (p.eft == allow))
进来的实体资源方法能不能在权限表里面找到一个一模一样的
[matchers]
m = r.sub, p.sub && r.obj == p.obj && r.act == p.act