工作原理
在 Casbin 中,访问控制通过基于 PERM 元模型(Policy、Effect、Request、Matchers) 的 CONF 文件来表达。改变项目中的授权方式只需编辑一个配置文件。你可以通过组合各个组件来构建自定义模型——例如在一个模型和策略集中同时使用 RBAC 角色与 ABAC 属性。
PERM 模型包含四个部分:Request、Policy、Effect 和 Matchers。它们共同定义了用户与资源之间的交互方式。
Request
request 定义(请求定义)指定一次访问请求的参数。一个基本的请求是由三个元素组成的元组:subject(谁在发起请求)、object(资源)和 action(操作)。
示例:
r = sub, obj, act
它设置了匹配逻辑所用的参数名及其顺序。
Policy
policy 定义(策略定义)描述访问规则的形态:字段名及其顺序。
示例:
p = sub, obj, act 或 p = sub, obj, act, eft
当定义中省略 eft(policy effect,策略效果)时,策略文件中的效果字段会被忽略,匹配上的策略会被视为"允许"。
Matcher
matcher(匹配器)定义请求如何与策略进行匹配。
示例:m = r.sub == p.sub && r.act == p.act && r.obj == p.obj
当请求的 subject、object 和 action 与某条策略的字段匹配时,就使用该策略的效果(p.eft)。该效果保存在 p.eft 中。
Effect
effect 部分用一个逻辑表达 式组合所有匹配策略的效果。
示例:e = some(where (p.eft == allow))
只要有任意一条匹配策略的效果为"allow",结果就是允许。
另一个示例:
e = some(where (p.eft == allow)) && !some(where (p.eft == deny))
这意味着:只有当至少一条策略允许且没有策略拒绝时,结果才是允许。如果 allow 和 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
你可以通过在每行末尾加上 \ 来把 matcher 拆到多行:
# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj \
&& r.act == p.act
in 运算符在 Go 实现中可用(在 jCasbin 或 Node-Casbin 中尚不可用):
# Matchers
[matchers]
m = r.obj == p.obj && r.act == p.act || r.obj in ('data2', 'data3')
数组必须包含不止一个元素;否则 Go 实现可能会 panic。
更多运算符请见 govaluate。