Casbin 与 Open Policy Agent(OPA)对比
Open Policy Agent(OPA)和 Casbin 都是开源策略引擎,经常一起进入候选名单。 OPA 是通用引擎:用一门语言 Rego 在 Kubernetes、基础设施和服务之间做决策。 Casbin 专注于应用内部的访问控制,规则以数据形式存储,可以在运行时修改。
总结
| Casbin | OPA | |
|---|---|---|
| 范围 | 应用访问控制 | 面向任意 JSON 输入的通用策略 |
| 规则写法 | 一个简短的模型文件加上按行写的策略规则 | 用 Rego 语言编写的程序 |
| 典型部署方式 | 在你的进程内作为库运行 | 以 sidecar 或守护进程运行,通过 HTTP 查询;也可作为 Go 库或 WebAssembly |
| 原生实现 | Go、Java、Node.js、Python、.NET、PHP、Rust、C++ 等 | Go |
| 规则和数据放在哪里 | 通过适配器放在你的数据库中 | 加载到 OPA 内存中的 bundle 和数据文档 |
| 修改权限 | 通过 Management API 添加或删除一行策略 | 修改数据,或发布新的策略 bundle |
| 通常由谁编辑规则 | 应用管理员,通过界面或 API | 工程师,通过代码评审 |
| 治理 | Apache 软件基金会(孵化中) | 云原生计算基金会(CNCF) |
Rego 与模型加策略
在 OPA 中,你用 Rego 编写决策逻辑本身:
package app.authz
default allow := false
allow if {
some role in data.user_roles[input.user]
some grant in data.role_grants[role]
grant.action == input.action
grant.resource == input.resource
}
Rego 表达能力很强。它可以检查任意嵌套的 JSON,所以 OPA 除了用于 API 授权,也用于 Kubernetes 准入控制和配置检查。它也是一门团队需要学习、测试和评审的语言。
在 Casbin 中,逻辑是模型文件里的一行,授权是一行行数据:
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
p, editor, article, write
g, alice, editor
大多数访问控制需求(角色、角色层级、租户、资源所有权、路径模式)都符合这种结构,见 支持的模型。内置运算符覆盖不到的逻辑,匹配器可以调用用你的应用语言编写的 自定义函数。
在运行时管理权限
应用通常需要一个管理界面,让人分配角色和授予权限。在 Casbin 中这就是一次 API 调用:
e.AddRoleForUser("bob", "editor")
e.AddPolicy("editor", "comment", "write")
改动立即生效,通过 适配器 保存到你的数据库,并由 watcher 同步到其他实例。 Management API 和 RBAC API 也覆盖列表和查询。
在 OPA 中,对应的是一份由你自己的服务维护、通过 bundle 或数据 API 下发到每个 OPA 实例的数据文档。这样做没问题,只是存储、分发和管理 API 都需要你自己构建。
部署与语言
OPA 用 Go 编写。 Go 程序可以嵌入它;其他语言通常通过 HTTP 查询 OPA 进程,或运行编译成 WebAssembly 的策略。
Casbin 为 Go、Java、Node.js、Python、.NET、PHP、Rust、C++ 等语言提供原生实现。一次检查就是一次进程内函数调用,没有序列化,也没有网络往返。同样的模型和策略文件在各语言中都能直接使用。
基础设施策略
对于 Kubernetes 准入控制和云配置,OPA 配合 Gatekeeper 是成熟的选择,有大量现成的策略库。 Casbin 也可以用在这里,有 K8s-Gatekeeper 和 Envoy 集成,但它的长处是应用授权。
如何选择
如果你想在基础设施和服务之间使用同一门策略语言,判定依赖复杂的结构化输入,或者策略应该由工程师以代码形式编写和版本管理,选 OPA。
如果你要为应用加上角色和权限,权限必须能由管理员在运行时编辑,希望 规则放在现有的数据库中,或者想要一个你所用语言的原生库、不需要额外的进程,选 Casbin。
试用 Casbin
在 在线编辑器 中测试模型和策略,或跟着 Go、Node.js、Python 或 Java 教程操作。
另见 对比概览。
Comments are powered by giscus and GitHub Discussions. They load from giscus.app and GitHub only after you click the button below.