правила firestore, соответствующие родительским данным, работают только в симуляторе - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь сделать простую часть прямого сообщения. У меня есть документ с некоторыми метаинформациями и подколлекция с отдельными сообщениями. Когда я пытаюсь получить сообщения, правила действительны в симуляторе, но в js я получаю каждый раз: Uncaught (в обещании) FirebaseError: Отсутствует или недостаточно разрешений .

Структура mongodb:

  • chatRooms
    • roomId
      • метаинформация (senderId / Name, recieverId / Name, timestamp и т.д.)
      • сообщения
        • идентификатор сообщения
          • имя
          • текст
          • метка времени

Правила:

match /chatRooms/{chatRoom}  {
  allow create: if request.auth.uid != null;
  allow update, delete: if resource.data.uid == request.auth.uid;   

  function isChatPartner() {
   return parentDoc().receiverId == request.auth.uid || parentDoc().senderId == request.auth.uid;
  }

  function parentDoc() {
    return get(/databases/$(database)/documents/chatRooms/$(chatroom)).data;
  }

  match /messages/{message} {
    allow read: if isChatPartner();
  }

}

JS-запрос:

db.collection("chatRoom").doc(_roomId).collection("messages").get().then(msg => {
   console.log(msg);
})

Кто-нибудь знает, что может быть не так?

1 Ответ

2 голосов
/ 14 октября 2019

Ваша база данных и правила не совпадают. Как правило, коллекция верхнего уровня называется "chatRooms", но в вашем коде она называется "chatRoom". Имена коллекций должны точно совпадать.

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

...