Правило Firestore: работа с одним документом, но не с ранжированным запросом, и почему? - PullRequest
0 голосов
/ 26 мая 2020

Вот две версии моего правила Firebase, и, на мой взгляд, они должны быть эквивалентны:

Version1:

match /transactions/{ts} {
  function isOwner() {
    return request.auth.uid == get(/databases/$(database)/documents/transactions/$(ts)).data.user;
  }

  allow read: if isOwner();
}

Version2:

match /transactions/{ts} {
  function isOwner() {
    return request.auth.uid == resource.data.user;
  }

  allow read: if isOwner();
}

Теперь, если я запрашиваю один документ, например db.collection('transactions').doc(someIDHere), два правила работают точно так же с точки зрения принятия или отклонения.

Однако, если я выполняю запрос, например db.collection('transactions').where('user','==',userid).get(), то будет обработана только версия 2, версия 1 сообщит об ошибке, но я не знаю, почему это так. Я проверил документ Firestore, но там нет достаточных объяснений. В частности, что означает метод get () в операторе правила и почему он отличается по диапазону запроса между использованием get (абсолютный путь) с использованием resource.data?

1 Ответ

1 голос
/ 26 мая 2020

Второе правило работает, потому что фильтр:

where('user','==',userid)

точно соответствует ограничениям правила:

request.auth.uid == resource.data.user

(я добавил туда «auth», которого вам не хватало - у request нет свойства uid.)

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

...