Я пытаюсь настроить правила безопасности, которые разрешают доступ к коллекции, на основе значения поля документа во вложенной коллекции.
Это работает, как и ожидалось, при извлечении отдельного документа по идентификатору, который являетсяget
операция.Тем не менее, при запросе main_collection
(операция list
) это завершается с ошибкой «Отказано в доступе».Поскольку в коллекции только один документ, это не тот случай, когда у меня нет разрешения на некоторые запрашиваемые документы, например, на этот вопрос .
МойСтруктура базы данных выглядит следующим образом.Он содержит перечисляемую коллекцию (main_collection
), в которой есть один документ (some_doc
), в которой есть одна подколлекция (sub_collection
), в которой есть один документ (another_doc
).
/main_collection/some_doc/sub_collection/another_doc
another_doc
имеет одно строковое поле someFieldValue
.
В этом примере мой запрос относится ко всей коллекции, то есть к одному документу.В моем реальном приложении оно запрашивает только те документы, к которым оно ожидает получить доступ, но конечный результат здесь тот же, потому что я не могу отфильтровать вложенную коллекцию документа из клиентской библиотеки.
firestore.collection('main_collection').get()
Это моя безопасностьrules.
service cloud.firestore {
match /databases/{database}/documents {
match /main_collection/{mainColDoc} {
// This operation works
allow get: if subCollectionDocumentHasField('someFieldValue');
// This operation fails with permission denied
allow list: if subCollectionDocumentHasField('someFieldValue');
// This checks for the existence of a field on the subcollection's document
function subCollectionDocumentHasField(fieldName) {
return get(/databases/$(database)/documents/main_collection/$(mainColDoc)/sub_collection/another_doc).data.keys().hasAny([fieldName]);
//return get(/databases/$(database)/documents/main_collection/some_doc/sub_collection/another_doc).data.keys().hasAny([fieldName]);
}
}
}
}
Функция subCollectionDocumentHasField
проверяет наличие поля someFieldValue
в документе another_doc
.В этой функции, если я заменим переменную $(mainColDoc)
на жестко закодированный идентификатор документа some_doc
, операция list
будет успешной.Поскольку в этом контексте можно использовать переменную пути $(database)
, я ожидаю, что другие тоже могут быть такими.
Это ошибка или ожидаемое поведение?