前言
之前所负责的业务要上线,所以最近都没有研究OpenFGA。今天研究了一下OpenFGA的CLI以及模块化模型,所以总结出这篇文章介绍一下用法,并且给出一些常见错误的解决方案。
下载安装CLI
官方github地址:github.com/openfga/cli
使用命令行下载、安装Cli
brew install openfga/tap/fga
查询是否可以成功连接到Openfga远程服务器
可以调用以下listStores的接口,对应的命令是:
fga store list // 本地
fga store list --api-url http://193.168.1.230:8080 // 远程服务器
如果成功连接的话,此时会返回store的
常用命令
模块化模型
共用一个模型
为了各个业务权限的互联互通,一般情况下一个应用程序应该只使用同一个模型。
两个原因:
- 因为对于一个APP而言,组织架构和人员内容应该是共享的,如果每个业务有独立的模型,则维护人员以及组织时需要维护多份,极为不便并且容易出问题。
- 不同的业务使用同一个模型时,可以传递各自权限。比如我拥有了某一个任务的权限,则自动拥有这个任务下的文档,群聊的权限。
性能问题
各个模块混在一起是否会影响性能?
因为每个业务的模型无论是分开,还是合并到同一个模型,业务本身的模型定义是不会变的。这就决定了在图的遍历过程中,路径的判断是相同的,目前我能想到的唯一会影响性能的就是数据量的问题。
当各个业务在同一个模型中时,这个数据量可能会非常的大,从而影响每次查询的效率。但是我们还是要相信数据库的查询速度,即使千万级的数据,加上了索引也可以是毫秒级别的查询。后期我会出一个测试报告,将我的授权模型以及数据量列出,供给大家参考。
模块化模型解决什么问题?
当很多授权模型耦合到同一个模型时,这个模型就会变得很大,难以理解。并且随着越来越多的团队开始使用模型时,每个授权模型的边界就变的模糊,导致整体的模型的定义越来越混乱。而同时OpenFGA的每次的模型变更都需要迁移数据,导致模型变更的成本很高,尽量减少变更模型。所以为了解决各个授权模型的耦合问题,OpenFGA有一个模块化模型的功能。
模块化模型本质上就是将模型的定义分散到各个文件中,从而让每个业务的授权模型有了“界”。同时也可以为一些公共模型进行独立的拓展(下文会举例子)。
模块化模型的使用
我们需要有一个fga.mod文件将各个模块的授权模型文件汇总起来。
里面两个核心属性
| 字段 | 描述 |
|---|---|
| schema | 用于描述组合模型的架构版本 |
| contents | 构成模块化模型的各个文件 |
例子
下文会直接举官方的例子,当然你也可以直接查看官方文档:openfga.dev/docs/modeli…
以下示例描述了 具有问题跟踪和 wiki 软件的 SaaS 组件的授权模型如何实现模块化模型。
核心模块:
每个业务都需要的组织架构以及用户组,这里为所有的模块所共用的
module core
type user
type organization
relations
define member: [user]
define admin: [user]
type group
relations
define member: [user]
问题追踪模块:
问题跟踪软件将与项目和问题相关的类型分离到单独的文件中。下面,我们还扩展了 type 以添加特定于 issue tracking 功能的关系:授权谁可以创建项目的能力。organization
module issue-tracker
extend type organization
relations
define can_create_project: admin
type project
relations
define organization: [organization]
define viewer: member from organization
module issue-tracker
type ticket
relations
define project: [project]
define owner: [user]
维基模型
我们可以将维基的模型放到一个文件中不断地让它丰富。也可以在这个维基模型中继承origanization来新增一个关系—— 谁可以在组织中创建空间
module wiki
extend type organization
relations
define can_create_space: admin //集成的新增关系
type space
relations
define organization: [organization]
define can_view_pages: member from organization
type page
relations
define space: [space]
define owner: [user]
最后整合这些fga的模型到fga.mod
schema: '1.2'
contents:
- core.fga
- issue-tracker/projects.fga
- issue-tracker/tickets.fga
- wiki.fga
执行cli的写入模型的命令
fga model write --store-id=$FGA_STORE_ID --file fga.mod
执行命令后就会返回当前的model了
报错以及解决方案
如果提示:
说明应该是fga.mod不规范,可能是
如果提示:
如果提示:
注意:这里的module需要在同级的文件夹下面
比如说我的fga.mod是这么写的
那么我的目录结构应该是这样的