我正在使用firebase构建多租户应用。构建应用程序时,我正在构建一个RBAC模型,使用户能够成为多个组织的一部分,并在每个组织中分配多个角色。每个角色都分配了用户可以访问的资源。
鉴于如下的firebase结构,如何创建一个合适的firebase安全规则来确定用户是否可以访问给定组织中的资源?
organizations
org1UUID
about
staff
uid1
roles
ViewerRoleUUID
about
type: "view"
resources
DashboardUUID: "true"
SomeSettingsUUID: "true"
MoreResourcesUUID: "true"
SysAdminUUID
about..
type: "full"
resources:
AdminAreaUUID: "true"
DashboardUUID: "true"
SomeSettingsUUID: "true"
type: "admin"
org2UUID...<repeat of above>
users
uid1
authinfo
organizations
org1UUID
roles
ViewRoleUUID: "true"
SysAdminUUID: "true"
org2UUID
roles
AnotherRoleUUID: "true"
由于firebase不支持规则中的多对多搜索,即使我更改了数据模型,我也看不到这种方式。我甚至没有看到访问节点的所有孩子的方法。我还考虑过将资源复制到用户数据,但仍然无法在不知道节点名称或ID的情况下找到访问任何节点子节点的方法。我见过的所有实现只允许用户分开一个角色,最终做类似
的事情".read": "(root.child('users/' + auth.uid + '/organizations/' + $organization).child('role').val() === "viewer"),
".write": "(root.child('users/' + auth.uid + '/organizations/' + $organization).child('role').val() === "admin")"
上述示例仅在为用户分配了一个角色时才有效。但是,如果用户需要分成两个或多个角色,具体取决于用户需要访问的资源,这将无效。
最初我想过只是将角色信息(包括其类型和资源列表)复制到每个用户。问题是即使数据结构被移动或复制到用户,搜索用户是否有权访问资源仍然会在尝试搜索给定公司的所有用户角色时解析,以确定用户是否具有访问权限。