How It Works
在Casbin中,访问控制模型被抽象为基于PERM元模型(策略,效果,请求,匹配器)的CONF文件。 为项目切换或升级授权机制就像修改配置一样简单。 您可以通过组合可用模型来定制自己的访问控制模型。 例如,您可以在一个模型内部将RBAC角色和ABAC属性结合在一起,并共享一套策略规则。
PERM模型由四个基础部分组成:策略,效果,请求和匹配器。 这些基础部分描述了资源和用户之间的关系。
Request
定义请求参数。 基本请求是一个元组对象,至少需要一个主体(被访问实体),对象(被访问资源)和动作(访问方法)。
例如,请求定义可能看起来像这样:r={sub,obj,act}
此定义指定了访问控制匹配函数所需的参数名称和顺序。
Policy
定义访问策略的模型。 它指定了策略规则文档中字段的名称和顺序。
例如:p={sub, obj, act}
或 p={sub, obj, act, eft}
注意:如果未定义eft(策略结果),则不会读取策略文件中的结果字段,匹配策略结果将默认允许。
Matcher
定义请求和策略的匹配规则。
例如:m = r.sub == p.sub && r.act == p.act && r.obj == p.obj
这个简单而常见的匹配规则意味着,如果请求的参数(实体,资源和方法)等于策略中找到的那些,那么返回策略结果(p.eft
)。 策略的结果将保存在p.eft
中。
Effect
对匹配器的匹配结果进行逻辑组合判断。
例如:e = some(where(p.eft == allow))
这个语句意味着,如果匹配策略结果p.eft
有(一些)允许的结果,那么最终结果为真。
让我们看另一个例子:
e = some(where (p.eft == allow)) && !some(where (p.eft == deny))
这个例子组合的逻辑意义是:如果有一个策略匹配到允许的结果,并且没有策略匹配到拒绝的结果,结果为真。 换句话说,当匹配策略都是允许时,结果为真。 如果有任何拒绝,两者都为假(更简单地说,当允许和拒绝同时存在时,拒绝优先)。
Casbin中最基本和最简单的模型是ACL。 ACL的模型CONF如下:
# Request definition
[request_definition]
r = sub, obj, act
# Policy definition
[policy_definition]
p = sub, obj, act
# Policy effect
[policy_effect]
e = some(where (p.eft == allow))
# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
ACL模型的一个示例策略为:
p, alice, data1, read
p, bob, data2, write
这意味着:
- alice可以读取data1
- bob可以写入data2
我们还支持通过在末尾添加''来进行多行模式:
# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj \
&& r.act == p.act
此外,如果您正在使用ABAC,您可以尝试如下例子中的'in'操作符,该例子是Casbin golang版本的(jCasbin和Node-Casbin还不支持):
# Matchers
[matchers]
m = r.obj == p.obj && r.act == p.act || r.obj in ('data2', 'data3')
但是你必须确保数组的长度超过 1,否则会引发难以恢复的错误(panic)。
对于更多的操作符,你可以看一下govaluate。