跳转至主要内容

Casbin 与 Open Policy Agent(OPA)对比

Open Policy Agent(OPA)和 Casbin 都是开源策略引擎,经常一起进入候选名单。 OPA 是通用引擎:用一门语言 Rego 在 Kubernetes、基础设施和服务之间做决策。 Casbin 专注于应用内部的访问控制,规则以数据形式存储,可以在运行时修改。

总结​

CasbinOPA
范围应用访问控制面向任意 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.