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