权限系统探索-OpenFGA的CLI和模块化模型使用

328 阅读4分钟

前言

之前所负责的业务要上线,所以最近都没有研究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的

常用命令

模块化模型

共用一个模型

为了各个业务权限的互联互通,一般情况下一个应用程序应该只使用同一个模型。
两个原因:

  1. 因为对于一个APP而言,组织架构和人员内容应该是共享的,如果每个业务有独立的模型,则维护人员以及组织时需要维护多份,极为不便并且容易出问题。
  2. 不同的业务使用同一个模型时,可以传递各自权限。比如我拥有了某一个任务的权限,则自动拥有这个任务下的文档,群聊的权限。

性能问题

各个模块混在一起是否会影响性能?

因为每个业务的模型无论是分开,还是合并到同一个模型,业务本身的模型定义是不会变的。这就决定了在图的遍历过程中,路径的判断是相同的,目前我能想到的唯一会影响性能的就是数据量的问题。

当各个业务在同一个模型中时,这个数据量可能会非常的大,从而影响每次查询的效率。但是我们还是要相信数据库的查询速度,即使千万级的数据,加上了索引也可以是毫秒级别的查询。后期我会出一个测试报告,将我的授权模型以及数据量列出,供给大家参考。

模块化模型解决什么问题?

当很多授权模型耦合到同一个模型时,这个模型就会变得很大,难以理解。并且随着越来越多的团队开始使用模型时,每个授权模型的边界就变的模糊,导致整体的模型的定义越来越混乱。而同时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是这么写的

那么我的目录结构应该是这样的