OpenFGA-compatible relationship-based (Zanzibar-style) authorization engine: DSL, JSON models, Check, ListObjects, ListUsers, CEL conditions
| 要看什么 | 汇总 | 原始证据与复现 |
|---|---|---|
| 固定版本的上游矩阵 | OpenFGA v1.22.1(commit 44054f54):Check 516/516,ListObjects 354/354,ListUsers 393/394(1 skip);语言夹具 29/29 | docs/conformance.md 的 Summary 与逐断言表;固定 commit 写在 scripts/fetch-upstream.sh;scripts/fetch-upstream.sh && ./scripts/conformance.sh |
| 唯一的 skip | simple_computeduserset_indirect_ref(list_users,consolidated_1_1_tests.yaml):期望值嵌在 request 里,没有顶层 expectation 或 errorCode,记为 skip/no_expectation | docs/conformance.md 的 Failure categories;逐断言表编号 57 |
| 随机差分 | seed 314159、271828 各 1095 组(1000 随机+95 定向),共 6570 次比较,0 不一致;定向脚本 204 组 / 612 次比较,0 不一致 | docs/evidence/oracle-summary.json、oracle-seed271828-summary.json、directed-summary.json;命令见 同版本差分 |
| 性能条件 | 1 万 / 10 万 / 100 万元组,三种扇出、20 层 group;native 与 JS release 的 p50/p95/max、峰值 RSS、图构建占比,macOS arm64 合成数据 | 实验方法、完整测量表;python3 scripts/performance.py optimized |
| 安装包调用 | moonfga@0.1.1 在全新模块中构造模型和元组后 Check,输出 anne can view roadmap: true | 见下表“版本对应” |
| 面 | 对应 | 说明 |
|---|---|---|
| 发布源码 | tag v0.1.1 | mooncakes 0.1.1 的打包内容与该 tag 指向的提交一致 |
| mooncakes | sundaysebasidian-byte/moonfga@0.1.1 | 包内容固定,不随 main 变化 |
| Pages | 最近一次推送到 main 的构建 | pages.yml 每次 push 到 main 都会重新构建,可能领先于 0.1.1 |
# 源码测试
git checkout v0.1.1
moon test --target all
# 安装包调用:在仓库外新建模块,复制 examples/library 的 main.mbt 和 moon.pkg 到 cmd/main
moon new consumer && cd consumer
moon add sundaysebasidian-byte/moonfga@0.1.1
moon run cmd/main
# 线上引擎:打开 Pages;对应的构建见 Actions 中 Pages 工作流的运行记录
gh run list --workflow pages.yml --limit 1| API | 通过 | 总数 | 失败 | 跳过 |
|---|---|---|---|---|
| Check | 516 | 516 | 0 | 0 |
| ListObjects | 354 | 354 | 0 | 0 |
| ListUsers | 393 | 394 | 0 | 1 |
| 能力 | 状态 | 说明 |
|---|---|---|
| Schema 1.1 DSL | 支持 | model、schema 1.1、type、relations、define、[user, group#member, user:*, user with cond]、or / and / but not、括号、computed userset、tuple-to-userset、condition、注释 |
| AuthorizationModel JSON | 支持 | 导入、导出;schema_version、type_definitions、relations、metadata.relations、conditions |
| 模型校验 | 支持 | 未知类型/关系、元组限制、禁止的循环、重复定义、条件参数类型;错误带行列位置 |
| 元组存储 | 支持 | 内存索引(按 object#relation、按 user)、写入/删除、上下文元组覆盖层、TupleReader trait |
| Check | 支持 | 完整 Check 请求深度预算 25、终端 join 不额外 dispatch、computed alias 迭代折叠、循环检测、通配符、union/intersection/difference 短路、TTU、条件求值 |
| BatchCheck | 支持 | 进程内批量执行,逐项返回结果或错误 |
| ListObjects / ListUsers | 支持 | 反向对象证明 / 用户集合展开、独立深度与条件错误传播、wildcard、userset 过滤器、contextual 合并语义 |
| Expand | 支持 | 返回关系重写树 |
| Explain | 支持 | 返回允许/拒绝的解析路径(--explain,Playground 里画成树) |
| CEL 子集 | 支持 | int / uint / double / bool / string / duration / timestamp / list / map / ipaddress,运算符、三元表达式、exists / exists_one / all / map / filter、常用字符串/时间/网络方法 |
| CLI | 支持 | validate、transform、check、list-objects、list-users、expand、test |
| .fga.yaml 测试 | 支持 | model / model_file、全局与用例元组、Check / ListObjects / ListUsers 断言、errorCode |
| ReadChanges | 不支持 | 内存存储没有变更日志 |
| FGA Modules | 不支持 | module / extends 语法与模块合并未实现;单文件模型可完整使用 |
| 持久化存储 / HTTP / gRPC | 不支持 | 只提供可嵌入的内存引擎和 CLI,持久化需要调用方自己封装 |
| 分页、consistency preference | 不支持 | List 接口一次返回全部结果 |
scripts/build-web.sh
node web/smoke.mjs # 对内置示例做冒烟断言
python3 -m http.server -d web/dist # 然后访问 http://localhost:8000moon add sundaysebasidian-byte/moonfga@0.1.1git clone https://github.com/sundaysebasidian-byte/moonfga
cd moonfga
export PATH="$HOME/.moon/bin:$PATH"
moon check --deny-warn
moon testmoon test --target native
moon test --target wasm-gc
moon test --target jsimport {
"sundaysebasidian-byte/moonfga/fga",
"sundaysebasidian-byte/moonfga/dsl",
"sundaysebasidian-byte/moonfga/store",
"sundaysebasidian-byte/moonfga/engine",
}let model = @dsl.parse_model(
"model\n schema 1.1\n\ntype user\n\ntype group\n relations\n define member: [user]\n\ntype document\n relations\n define viewer: [user, group#member]\n",
)
let store = @store.MemoryStore::new()
let _ = store.write(
@fga.Tuple::{ object: "group:eng", relation: "member", user: "user:anne", condition: None },
)
let _ = store.write(
@fga.Tuple::{ object: "document:roadmap", relation: "viewer", user: "group:eng#member", condition: None },
)
let engine = @engine.Engine::new(model, store as &@fga.TupleReader)
let allowed = engine.check("document:roadmap", "viewer", "user:anne")
println(allowed.to_string()) // truemoon run examples/library# 校验 DSL 或 JSON 模型
moon run cmd/main -- validate examples/basic/model.fga
# DSL -> JSON / JSON -> DSL
moon run cmd/main -- transform examples/basic/model.fga --to json
moon run cmd/main -- transform examples/basic/model.fga --to dsl
# Check(--explain 打印解析路径)
moon run cmd/main -- check \
--model examples/basic/model.fga \
--store examples/basic/tuples.fga \
--object document:budget --relation viewer --user user:bob --explain
# ListObjects / ListUsers
moon run cmd/main -- list-objects \
--model examples/basic/model.fga --store examples/basic/tuples.fga \
--type document --relation viewer --user user:bob
moon run cmd/main -- list-users \
--model examples/basic/model.fga --store examples/basic/tuples.fga \
--object document:budget --relation viewer --filters user
# Expand 关系树
moon run cmd/main -- expand \
--model examples/basic/model.fga --store examples/basic/tuples.fga \
--object document:budget --relation viewer
# 条件(ABAC)示例
moon run cmd/main -- check \
--model examples/abac/model.fga --store examples/abac/tuples.fga \
--object document:plan --relation viewer --user user:dana \
--context '{"office":"hq","allowed":["remote"]}'
# 运行 .fga.yaml 测试
moon run cmd/main -- test examples/basic/store.fga.yaml
moon run cmd/main -- test examples/abac/store.fga.yamlscripts/fetch-upstream.sh # 首次运行,固定 commit
./scripts/conformance.sh # 运行两个矩阵并检查 95/90 阈值
moon run cmd/language # DSL <-> JSON 夹具,29/29Install
Download zipOpenFGA-compatible relationship-based (Zanzibar-style) authorization engine: DSL, JSON models, Check, ListObjects, ListUsers, CEL conditions