Правила безопасности Firestore проверяют, существует ли ссылка
Мне интересно, как я могу проверить, является ли значение документа ссылкой на другой документ, а документ существует с использованием правил безопасности firebase.
То, что я пробовал:
function validate(document) {
return exists(document.reference)
}
match /collection/{document} {
allow read: if request.auth != null;
allow create, update: if isAdmin(request.auth.uid) && validate(request.resource.data);
}
Поскольку это не сработало, я попытался выяснить, какой тип document.ref
есть. К сожалению, здесь нет ни одного перечисленного: https://firebase.google.com/docs/firestore/reference/security/?authuser=0#data_types
Я пробовал path
поскольку он наиболее очевидный, с которым можно работать, существует. Я не ожидал, что это сработает. Другой догадкой была, возможно, map
или string
. Оба были неправильными.
Поскольку я не знаю, что это может быть, и нет ничего документированного, как я могу преобразовать ссылку на путь, теперь я должен спросить здесь.
Кто-нибудь нашел решение?
TL; DR:
Мне нужно проверить использование правил безопасности Firestore, существует ли ссылка, сохраненная в документе, и она существует в базе данных.
Спасибо, Деннис
Ответы
Ответ 1
В этой строке:
allow create, update: if isAdmin(request.auth.uid) && validate(request.resource.data)
вместо вызова "request.resource.data" вы должны просто вызвать "resource.data":
allow create, update: if isAdmin(request.auth.uid) && validate(resource.data)
Как упоминалось здесь, переменная ресурса представляет документ Firestore, тогда как переменная " запрос " представляет запрос, сделанный по этому пути, поэтому не содержит информации о фактических значениях в документе.
Попробуйте и дайте мне знать, если это не сработает для вас.
Ответ 2
Согласно документации exists()
:
Указанный путь должен начинаться с /databases/$(database)/documents
.
Поэтому вы должны изменить свою функцию проверки:
function validate(document) {
return exists(/databases/$(database)/documents/$(document.reference))
}