我正在使用 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")"
上面的示例仅在用户被分配一个角色时才有效。但是,如果用户需要根据用户需要访问的资源而分为两个或多个角色,这将不起作用。
最初我考虑只是将角色信息(包括其类型和资源列表)复制给每个用户。问题是即使数据结构被移动或复制给用户,搜索以查看用户是否有权访问资源仍然可以解决尝试搜索给定公司的所有用户角色以确定用户是否有权访问.