У меня есть приложение, в котором у меня есть объекты данных, и эти объекты могут быть прочитаны / записаны как отдельными пользователями, так и группой пользователей. Я пытаюсь выяснить, каков наилучший подход к написанию правил безопасности для такой логики и лучший способ структурировать мою БД в реальном времени.
Я пытался найти решение, но так и не нашел точного варианта использования. Вот пример моей БД:
{
"data": {
"data1": {
"id": "data1",
"name": "Some data",
"content": "Some content...",
"visibility": "private",
"owner": "user1"
},
"data2": ...
},
"dataPermissions": {
"data1": {
"user1": "read",
"user2": "write",
"group1": "write"
},
"data2": {...}
},
"groupMembers": {
"group1": {
"user3": true,
"user4": true
}
},
"userGroups": {
"user4": {
"group1": true
}
...
}
}
Мой вопрос заключается в том, как настроить правила безопасности, чтобы проверить, может ли пользователь читать / писать в узел данных? Я знаю, как проверить на одного пользователя. Но я не могу понять, как проверить группу. Как проверить в правилах безопасности, например. user4
может читать / писать в data1
узел? Поскольку у меня может быть несколько групп на пользователя и несколько групп на узлы данных, я не могу адресовать это динамической переменной $uid
.
Обратите внимание, что я открыт для изменений в структуре БД. Мне более любопытно, как справиться с этой проблемой в целом без большого количества дублирующих данных (например, сохранение всех пользователей из группы в dataPermissions под узлом идентификатора группы), чтобы поддерживать нормальное обслуживание БД.
Вот как я проверяю права пользователей в правилах безопасности:
"data": {
"$dataId": {
".read": "data.child('owner').val() == auth.uid || data.child('visibility').val() == 'public' || root.child('dataPermissions/' + $dataId + '/' + auth.uid).exists()",
".write": "false"
}
},
Спасибо за помощь.