Ошибка разрешения Firestore при проверке подполя в правилах безопасности - PullRequest
0 голосов
/ 27 марта 2020

Я получаю «Отсутствует или недостаточно разрешений», когда у меня есть правило безопасности, которое проверяет подполе. Например:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /entries/{id} {
      allow read: if resource.data.business.id == "hh7AvLpTbFGRmCGodLV4";
    }
  }
}

Единственный документ, который у меня есть в коллекции entries:

{
  "batchId": "bnzVkufp9mM6yGokUYug",
  "business": {
    "id": "hh7AvLpTbFGRmCGodLV4"
  }
}

Мой запрос:

firestore()
  .collection('entries')
  .where('batchId', '==', 'bnzVkufp9mM6yGokUYug')

Если я изменил правило безопасности до allow read: if resource.data.batchId == "bnzVkufp9mM6yGokUYug", работает нормально. Есть что-то, что я пропустил?

Примечание:

  • Правило отлично работает при тестировании с использованием "Правила игровой площадки" в консоли Firebase, но не получилось в работе.
  • У меня есть другой проект, который отлично работает с правилами, которые проверяют подполе. Однако для двух новых проектов Firebase, которые я создал, это не работает.
  • Я обнаружил связанную проблему с 2017 года ( Правила безопасности Firestore, вложенное поле ). Может ли это быть той же самой проблемой, которая появляется снова?

1 Ответ

0 голосов
/ 27 марта 2020

Важно понимать, что правила безопасности не являются фильтрами .

В настоящее время ваше правило гласит, что во всех запросах в коллекции «записи» должен быть указан фильтр для business.id, что равно "hh7AvLpTbFGRmCGodLV4". У вашего запроса сейчас нет этого фильтра, поэтому правило всегда будет отклонять его. Если вы хотите, чтобы запрос работал с этими правилами, он должен выглядеть следующим образом:

firestore()
  .collection('entries')
  .where('batchId', '==', 'bnzVkufp9mM6yGokUYug')
  .where('business.id', '==', 'hh7AvLpTbFGRmCGodLV4')
...