Разрешения пожарного депо; проверка, находится ли пользователь в массиве - PullRequest
0 голосов
/ 27 марта 2020

В Cloud Firestore у меня есть коллекция документов с полем массива, содержащим всех пользователей, которые должны иметь разрешение на чтение этого документа. Мои упрощенные правила безопасности:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /collection_name/{document=**} {
      allow read: if request.auth.uid in request.resource.data.listOfIds.toSet();
    }
  }
}

Пример упрощенного документа:

{
  listOfIds: ["uid1", "uid2"]
}

Использование симулятора правил для выполнения считывает работу, как и ожидалось. Однако выполнение аналогичного запроса с использованием API Android возвращает ошибку «Отказано в доступе». Я думаю, что я ограничиваю свой запрос теми же способами, что и правила (это требование Firestore; оно не отфильтровывает документы, которые пользователь не может прочитать для вас).

firestoreClient.collection("collection_name")
    .whereArrayContains("listOfIds", firebaseUid)
    .get()
    .addOnCompleteListener(...);

1 Ответ

0 голосов
/ 27 марта 2020

Оказывается, Firestore думал, что запрос не был должным образом ограничен определенными разрешениями на чтение. Это был .toSet(), который сбросил это. Удаление этого привело к ожидаемому поведению.

Почему у меня было .toSet() для начала? Я ошибочно считал, что для преобразования массива в набор необходимо использовать оператор in. Этот оператор работает как со списками , так и со множествами.

...