深入理解 Casbin 的匹配机制
· 6 分钟阅读
本文介绍如何用 Casbin 库设计和实现 RBAC。对于具有资源层级、角色会继承权限的 SaaS 平台,Casbin 是一个高性能的选择。
RBAC简介
RBAC 根据用户拥有的角色来限制访问。为了说明层级式 RBAC 如何工作,我们先看看 Azure 的 RBAC,再在 Casbin 中实现一个类似的模型。
Azure 的层级式 RBAC

在 Azure 中,Owner 角色可以作用于不同的范围。如果我在订阅级别拥有 Owner,那么我就是该订阅下所有资源组和资源的 Owner。如果我在资源组级别拥有 Owner,那么我就是该组中所有资源的 Owner。
下图显示了订阅级别的 Owner 权限。 
查看该订阅下某个资源组的 IAM,可以看到继承来的 Owner 权限。 
这就是 Azure 的 RBAC 的层级性。很多系统都使用类似的层级。在本教程中,我们用 Casbin 实现一个类似的模型。
Casbin 如何工作
理解 Casbin 的组成部分(请求、策略、 匹配器、效果),能让你更容易地设计和调优 RBAC 模型。
什么是ACL?
ACL(访问控制列表) 把用户映射到操作,把操作映射到资源。
模型定义
一个最小的 ACL 模型:
[request_definition]
r = sub, act, obj
[policy_definition]
p = sub, act, obj
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
- request_definition:定义请求的格式。例如
alice, write, data1的意思是“Alice 能写 data1 吗?” - policy_definition:定义策略的格式。例如策略
alice, write, data1授予 Alice 写 data1 的权限。 - policy_effect:多条匹配的策略如何合并(例如 allow-override)。
- matchers:必须满足的条件:
r.sub == p.sub && r.obj == p.obj && r.act == p.act。
在 Casbin 编辑器中试一试
打开 Casbin 编辑器,把上面的模型粘贴到 Model 编辑框中。
在策略编辑器中粘贴以下内容:
p, alice, read, data1
p, bob, write, data2
在请求编辑器中粘贴以下内容:
alice, read, data1
结果将是:
true
