Как составить список всех документов, которые пользователь может прочитать из коллекции Firestore? - PullRequest
0 голосов
/ 13 февраля 2019

Как получить все документы в собрании, для которого у текущего пользователя есть разрешения на чтение?

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

Каждый пользователь в этом приложении может принадлежать нескольким группам.Чтения заблокированы для групп, в которые они были добавлены.

match groups/{group} {
  allow read: if exists(/databases/$(database)/documents/groups/$(group)/users/$(request.auth.uid));
}

Вот как это будет выглядеть с гипотетическим оператором subcollection-contains-id.

firestore()
  .collection("groups")
  .where("users", "subcollection-contains-id", user.uid);

В качестве временного обходного пути Iпереместил эту логику в облачную функцию.Вот краткое описание того, как это работает.

for (let group of firestore().collection("groups")) {
  let user = firestore.doc(`groups/${group.id}/users/${uid}`);

  if (user.exists) {
    // Send this group id to the client
  }
}

Как я могу объединить эти проблемы и перенести эту логику на сторону клиента, не ослабляя правила безопасности?

1 Ответ

0 голосов
/ 13 февраля 2019

Вы можете добавить поле owners в документы внутри коллекции

owners: ["uid1", "uid2"]

Затем вы можете получить все сообщения с помощью uid, выполнив поиск по array_contains

ref.where("owners", "array-contains", uid)

В правилах вы можете добавить что-то вроде этого:

allow read: if request.resource.data.owners.hasAny([request.auth.uid]) == true

allow update: if request.resource.data.owners.hasAny([request.auth.uid]) == true

...