Почему я получаю отказ в разрешении из моего запроса Firebase Firestore? - PullRequest
0 голосов
/ 25 мая 2020

Я знаю, что есть много похожих сообщений, но мне не удалось найти правильный ответ на мою проблему. Хотя я уверен, что это, вероятно, что-то простое.

Я получаю исключение Permission Denied, когда пытаюсь сделать следующий запрос:

firestore.collection(COLLECTION_RESTAURANT)
.whereArrayContains(KEY_ADMIN_ID, "myUserId")
.get()
.await()

Сущность «Ресторан» содержит массив of UserIds, который я подтвердил, является правильным идентификатором, который я отправляю в моем запросе. У объекта также есть свойство isVisible, для которого установлено значение true для объекта, который я пытаюсь получить.

Сейчас правила записываются следующим образом:

  match /databases/{database}/documents {

    match /restaurants/{restaurantId} {

        function restaurantIsOnline() {
          return resource.data.isVisible == true;
        }

        allow read: if restaurantIsOnline();

        allow create: if false;
        allow update: if false;
        allow delete: if false;
    }
  }

Когда я меняю правила на прочтите allow read: if true;, то я получу успешный результат, но я не уверен, что понимаю, почему эта функция не работает.

1 Ответ

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

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

  1. Запрос, который запрашивает только видимые документы.
  2. Правила безопасности, гарантирующие, что разрешен только этот запрос.

Прямо сейчас у вас есть правило безопасности, но еще не запрос. Поэтому вам также необходимо отфильтровать isVisible, равное true в вашем коде:

firestore.collection(COLLECTION_RESTAURANT)
  .whereArrayContains(KEY_ADMIN_ID, "myUserId")
  .whereEqualTo("isVisible", true)
  .get()
  .await()

Также см. Документацию Firebase о безопасном запросе данных .

...