Правила безопасности Firestore: использование get () в методе списка hasAny ()

Мне было интересно, если это правило безопасности будет возможно:

function productForUser() {
        return resource.data.products.hasAny(get(/databases/$(database)/documents/Users/$(request.auth.uid)).data.products);
    }

Когда я пытаюсь протестировать его на площадке тестирования на веб-сайте Firebase, это оказывается успешным. Однако, когда я пытаюсь запустить его с Javascript, с помощью этого запроса я получаю отказ в чтении с «отсутствующими или недостаточными разрешениями»:

query.where("products", "array-contains", productId);

Я могу подтвердить, что у пользователя есть массив продуктов, связывающийся с конкретным продуктом, который ищется в запросе.

Заранее спасибо.

Всего 1 ответ


Ваше правило работает в симуляторе консоли, потому что симулятор поддерживает только запросы типа «get» для одного документа. Это не работает для запросов, потому что правила безопасности не являются фильтрами . Правило не будет оцениваться для каждого документа в коллекции, поскольку это не будет хорошо масштабироваться для очень больших коллекций. Чтобы указать условия для запросов, вам нужно будет предоставить точные значения для проверки клиентом - вы не сможете использовать get () для поиска других значений.

Если вы хотите протестировать запросы перед публикацией своих правил, вам не следует использовать симулятор, а вместо этого используйте локальный эмулятор для тестирования кода, который фактически выполняет запрос.


Есть идеи?

10000