Правильные правила безопасности Firebase для реализации RBAC

Я нахожусь в процессе создания многопользовательского приложения с использованием 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 не поддерживает много-многие поиски в правилах, я не вижу способа, даже если я изменю модель данных, как это было бы возможно. Я даже не вижу способа получить доступ ко всем дочерним элементам узла. Я также думал о копировании ресурсов в данные пользователей, но все еще не мог найти способ получить доступ к дочерним элементам любого узла, не зная имени или идентификатора узла. Все реализации, которые я видел, позволяют пользователю быть отделенным от одной роли и в конечном итоге делать что-то вроде

".read": "(root.child('users/' + auth.uid + '/organizations/' + $organization).child('role').val() === "viewer"),
".write": "(root.child('users/' + auth.uid + '/organizations/' + $organization).child('role').val() === "admin")"

Приведенный выше пример будет работать только в том случае, если пользователю была назначена одна роль. Однако, если пользователю необходимо разделить две или более ролей в зависимости от ресурсов, доступ к которым пользователю необходим, это не сработает.

Изначально я думал просто скопировать информацию о роли, включая ее тип и список ресурсов, каждому из пользователей. Проблема заключается в том, что даже если структура данных была перемещена или скопирована для пользователя, поиск, чтобы узнать, есть ли у пользователя доступ к ресурсу, по-прежнему будет разрешаться при попытке поиска всех ролей пользователей для данной компании, чтобы определить, есть ли у пользователя доступ. .


person Night Monkey    schedule 04.12.2015    source источник
comment
В документах правил безопасности это объясняет hasChildren, но, похоже, работает только для дочернего узла, который вы знаете, например root.child('groupID').hasChildren('one') firebase.com/docs/security/api/ruledatasnapshot/   -  person Night Monkey    schedule 04.12.2015