跳转至主要内容

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。

Comments are powered by giscus and GitHub Discussions. They load from giscus.app and GitHub only after you click the button below.