Правила безопасности Firebase для дочерних элементов в массивах
У меня есть следующая структура данных в моей базе данных:
{
"groups" : {
"-KEFQ7rTQscPX4hqn6ec" : {
"createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
"description" : "Test",
"isPublic" : true,
"title" : "T1"
},
"-KEFQao_Wd-Y-nLzIx2e" : {
"createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
"description" : "B",
"isPublic" : false,
"title" : "E"
}
}
и я пытаюсь добиться следующего:
- Каждый может прочитать все группы с помощью "isPublic" == true
- Только зарегистрированные пользователи могут видеть группы, которые они создали
Мой первый подход:
{
"rules": {
"groups": {
".read": true,
"$id": {
".read": "data.child('isPublic').val() === true"
}
}
}
}
В этом посте рассказывается о том, почему он не работает, но я не мог понять, как я могу заставить его работать.
Изменить 1:
Этот пост имеет решение для публичной / частной проблемы (мой вопрос 1.), но не для второго вопроса.
Изменить 2:
Спасибо @VonD за рабочее решение для общественной / частной проблемы.
С этим решением проблема с публичным / частным будет решена. Учитывая, что в частной группе много членов, и их идентификаторы будут храниться в другом массиве "members" - как я могу разрешить доступ к группе только в том случае, если я являюсь членом?
"privateGroups": {
"b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c": {
"-KEFQao_Wd-Y-nLzIx2e" : {
"createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
"description" : "B",
"title" : "E",
"members": [userId1, userId2, userId3...]
}
}
}
1 ответ
Требуемые правила безопасности не могут быть реализованы с вашей структурой документа: если вы хотите выразить, что данный пользователь может читать некоторые из дочерних документов данного узла, пользователь сможет получить к ним доступ только по их полному пути, например "groups/-KEFQao_Wd-Y-nLzIx2e", но он не сможет получить список групп, соответствующих заданным критериям (если, конечно, вы не ведете по другому пути список групп, к которым пользователь может получить доступ, что означает, что вы могли бы дублировать все идентификаторы публичных групп для каждого пользователя).
Структура документа, которая бы лучше соответствовала правилам безопасности firebase, была бы:
{
"publicGroups": {
"-KEFQ7rTQscPX4hqn6ec" : {
"createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
"description" : "Test",
"title" : "T1"
}
},
"privateGroups": {
"b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c": {
"-KEFQao_Wd-Y-nLzIx2e" : {
"createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
"description" : "B",
"title" : "E"
}
}
}
}
Правила безопасности тогда легко реализовать:
{
"publicGroups": {
".read": true
},
"privateGroups": {
"$userId": {
".read": "auth.uid === $userId"
}
}
}
Надеюсь, поможет.