跳转至主要内容

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