Firestore: доступ к документам в коллекции пользователя имеет разрешение на - PullRequest
0 голосов
/ 24 мая 2019

У меня есть коллекция объявлений, которая используется для хранения данных.Однако у каждого документа есть поле, называемое «разрешения», которое содержит строку уровня разрешений.Я написал функцию, чтобы определить, есть ли у пользователя доступ на основе его уровня доступа и ресурса.

Когда я настраиваю обратный вызов onSnapshot для одного документа, который должен работать, я получаю ответ.Как только я переключаю его на получение снимка коллекции, он получает ошибку недопустимых разрешений.Основываясь на том, что я мог найти, Firestore не работает, если есть вероятность, что пользователь не имеет доступа ни к одному из документов в коллекции.Какая модель, в которой я должен использовать?Как я могу получить документы, к которым у пользователя тоже должен быть доступ?

Правила

match /chapters/{chapter} {
        function isMember() {
          return exists(/databases/$(database)/documents/chapters/$(chapter)/members/$(request.auth.uid))
      }

      function getUser() {
        return get(/databases/$(database)/documents/chapters/$(chapter)/members/$(request.auth.uid))
      }

      function hasPermission(userPermission, documentPermission) {
        return documentPermission == "all" || userPermission == "admin" || userPermission == documentPermission
      }

        allow read: if isMember()

      match /announcements/{announcement} {
        allow read: if isMember() && hasPermission(getUser().data.permissions, resource.data.permissions)
      }
}

Работает vvv

firestore.collection("chapters").doc("chapter-1").collection("announcements").doc("doc1").onSnapshot(doc => {
                const announcements = doc.data()

                console.log(announcements)
        })

Не работает vvv

 firestore.collection("chapters").doc("chapter-1").collection("announcements").onSnapshot(docs => {
            docs.forEach(doc => {
                const announcements = doc.data()

                console.log(announcements)
            })
        })

1 Ответ

1 голос
/ 24 мая 2019

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

Как объясняется в doc ,

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

Вам необходимо "написать свои запросы, чтобы соответствовать ограничениям вашей безопасностиrules ".

С другой стороны,

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

Именно поэтому он работает, когда вы запрашиваете только одинДокумент с

firestore.collection("chapters").doc("chapter-1").collection("announcements").doc("doc1").onSnapshot()


Таким образом, для запроса коллекции необходимо добавить фильтр к вашему запросу следующим образом:

firestore.collection("chapters").doc("chapter-1").collection("announcements").where("permissions", "==", "xxxxx");
...