适用于实施RBAC的firebase安全规则

时间:2015-12-04 00:10:47

标签: firebase firebase-security firebase-authentication firebase-hosting

我正在使用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")"

上述示例仅在为用户分配了一个角色时才有效。但是,如果用户需要分成两个或多个角色,具体取决于用户需要访问的资源,这将无效。

最初我想过只是将角色信息(包括其类型和资源列表)复制到每个用户。问题是即使数据结构被移动或复制到用户,搜索用户是否有权访问资源仍然会在尝试搜索给定公司的所有用户角色时解析,以确定用户是否具有访问权限。

0 个答案:

没有答案