Правила безопасности 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))
}