🧠 什么是 OpenFGA?
OpenFGA 是由 Auth0/Okta 和 Facebook 联合提出并开源的一个高性能、可扩展的 细粒度授权引擎,基于 Zanzibar(Google 权限系统)思想实现。
它支持复杂权限关系建模和授权校验,适用于协作类产品、多租户 SaaS、大规模权限体系等场景。
🔑 与传统权限模型的比较
| 模型 | 特点 | 适用场景 |
|---|---|---|
| RBAC(基于角色) | 角色赋权,简单高效 | 企业内部系统、小权限体系 |
| ABAC(基于属性) | 依赖用户/资源属性 | 有动态策略、需要细致属性控制 |
| ReBAC(基于关系) ✅ | 权限基于对象之间的“关系” | 协作平台、SaaS 多租户、复杂权限继承系统 |
OpenFGA 使用的是 ReBAC(关系型权限控制)模型。
🔧 OpenFGA 的核心组成
1. Authorization Model(授权模型)
定义资源、角色、关系、权限的规则结构。
如:
fga
复制编辑
type user
type document
relations
define reader: [user]
define editor: [user]
define owner: [user] as self or editor
2. Tuples(关系数据)
记录了谁和什么之间的关系,相当于权限数据库中的行。
例如:
json
复制编辑
{
"user": "user:alice",
"relation": "editor",
"object": "document:doc1"
}
3. Check(权限检查 API)
是否允许某人对某个资源做某事:
json
复制编辑
{
"user": "user:alice",
"object": "document:doc1",
"relation": "editor"
}
4. ListObjects(可访问资源列举)
查询用户对哪些资源拥有某种权限。
json
复制编辑
{
"user": "user:alice",
"relation": "reader",
"type": "document"
}
5. Playground(Web UI)
内置 UI,帮助你 建模、测试、调试 权限逻辑。
访问地址:
bash
复制编辑
http://localhost:8080/playground
🚀 OpenFGA 工作流程示意图
mermaid
复制编辑
graph TD
A[定义 Authorization Model] --> B[添加 Relationship Tuples]
B --> C[调用 Check API 验证权限]
C --> D[返回 true / false]
B --> E[调用 ListObjects API 列举权限资源]
🧪 示例:文档编辑权限
模型:
fga
复制编辑
type user
type document
relations
define reader: [user]
define editor: [user]
define owner: [user] as self or editor
Tuples(关系):
json
复制编辑
{ "user": "user:alice", "relation": "editor", "object": "document:doc1" }
Check:
json
复制编辑
{
"user": "user:alice",
"object": "document:doc1",
"relation": "owner"
}
=> 返回 true(因为 editor 是 owner 的子集)