跳转至主要内容

How It Works

在 Casbin 中,访问控制以基于 PERM 元模型(Policy、Effect、Request、Matchers) 的 CONF 文件来表达。要改变项目中的授权方式,只需编辑一个配置文件。可以组合各个组件构建自定义模型,例如在同一个模型和策略集中同时使用 RBAC 角色和 ABAC 属性。

PERM 模型有四个部分:Request、Policy、Effect 和 Matchers。它们共同定义用户和资源如何交互。

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))

只要有一条匹配的策略效果为“allow”,结果就是允许。

另一个例子:

e = some(where (p.eft == allow)) && !some(where (p.eft == deny))

这表示:只有至少一条策略允许、且没有策略拒绝时,结果才是允许。允许和拒绝同时匹配时,拒绝优先。

ACL 是 Casbin 中最简单的模型。下面是一个最小的 ACL 模型:

# 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

这个模型的策略示例:

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

Go 实现中可以使用 in 运算符(jCasbin 和 Node-Casbin 暂不支持):

# Matchers
[matchers]
m = r.obj == p.obj && r.act == p.act || r.obj in ('data2', 'data3')
警告

数组必须包含多于一个元素,否则 Go 实现可能会 panic。

更多运算符见 govaluate。