什么是 OpenFGA

192 阅读2分钟

🧠 什么是 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 的子集)