Есть ли какая-либо функция для правил при чтении всех документов в коллекции? - PullRequest
2 голосов
/ 15 апреля 2019

У меня возникли проблемы с настройкой правил для проекта пожарного депо. Я пытаюсь изучить настройку базы данных, но не могу найти никакого решения для этого. Так что нет проблем, когда я пытаюсь получить документ из моей коллекции "списков". Но когда я пытаюсь получить все документы в «списках» коллекции, xcode сообщает мне «Отсутствует или недостаточно разрешений». Моя цель - иметь пользователей, которые могут создавать документы в «списках» коллекций, но они могут только читать документы в «списках», где они появляются в массиве документов «members».

Сейчас я могу без проблем добавлять документы в коллекцию («списки»), но не могу их прочитать. Я могу только прочитать их один за другим из xcode с определенной целью.

Какие-нибудь советы или идеи?

service cloud.firestore {
  match /databases/{database}/documents {

  match /{documentId} {
    allow read: if request.auth.uid != null;
  }

   match /lists/{docId} {
     allow write: if request.auth.uid != null;

     allow read: if request.auth.uid in resource.data.members
  }
 }
}

Xcode.

//working
let docRef = db.collection("lists").document("j0hHA5TLPETf6JRMbC1s")
        docRef.getDocument { ...


//not working due to permission failed
db.collection("lists").getDocuments() { ...

Ответы [ 2 ]

2 голосов
/ 15 апреля 2019

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

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

Клиент должен запрашивать только те документы, которые удовлетворяют правилам.Прямо сейчас запрос запрашивает ВСЕ документы в коллекции списков, независимо от того, имеет ли клиент доступ к ним.Это приведет к сбою правила безопасности, потому что он пытается прочитать документы, к которым у него нет доступа.

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

0 голосов
/ 15 апреля 2019

На самом деле, вы на правильном пути, я думаю, если вы измените свой код следующим образом, он будет работать.

Вместо этого:

match /{documentId} {
    allow read: if request.auth.uid != null;
  }

Используйте это:

match /lists {
     allow read: if request.auth.uid != null;
  }

Таким образом, когда вы пытаетесь получить доступ к lists без documentId, он проверит auth.uid.

Но когда вы пытаетесь получить доступ к документу, напр. lists/1, он проверит, существует ли этот пользователь в массиве.

...