Firebase Firestore: пользовательский доступ администратора
в Firebase Firestore я пытаюсь разрешить только (назначенным пользователем) администраторам писать/обновлять / удалять ресурсы, и для этого у меня есть следующие правила безопасности:
service cloud.firestore {
  match /databases/{database}/documents {
    match /resources {
      allow read;
      allow write, update, delete: if get(/users/$(request.auth.uid).isAdmin);
    }
    match /resources/{resource} {
      allow read;
      allow write, update, delete: if get(/users/$(request.auth.uid).isAdmin);
    }
  }
}
Я вхожу в систему с пользователем, который отмечен как администратор в пользователи коллекция:

NfwIQAjfNdS85yDvd5yPVDyMTUj2 является UID, полученным из панели аутентификации:

однако по какой-то причине (обновление: причины определены; см. ответ), я получаю PERMISSION_DENIED ошибки при записи ресурсы коллекция после того, как я абсолютно уверен, что вошел в систему с пользователем admin.
возможно, можно просмотреть журналы запросов из Firestore? Тогда я мог бы посмотреть на что!--1--> похоже, что это соответствует моим коллекциям и правилам.
2 ответов
при написании моего вопроса, я сделал это работать! Я сделал две ошибки, которых можно было бы избежать, если бы я правильно прочитал документы.
во-первых все вызовы сервис-функция, определяемая get необходимо префикс пути с  / базы данных / $(база данных) / документы/. Так что это правило:
allow write: if get(/users/$(request.auth.uid)).isAdmin;
становится этот:
allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).isAdmin;
это долго, я знаю, но так оно и есть. Я не уверен, почему Firestore не может сделать это сам по себе, хотя, видя, что тот же префикс пути останется тем же во всех вызовах get, но, возможно, это для какой-то будущей функции, которая еще не готова, например, перекрестный запрос базы данных или что-то еще.
второй, the
некоторые моменты я заметил
match /resources указывает на коллекцию, правила которой не влияют на ее документы. здесь я цитирую из doc
правила для коллекций не применяются к документам в этой коллекции. Необычно (и, вероятно, ошибка) иметь правило безопасности, которое записывается на уровне коллекции, а не на уровне документа.
поэтому вам не нужно писать правила для сборники
тогда в правилах allow write, update, delete: вы можете сказать allow write: и в частности allow create, update, delete: любой из трех вариантов или комбинировать их.
попробуй такое
service cloud.firestore {
    match /databases/{database}/documents {
      match /resources/{resource} {
        function isAdmin() {
            return get(/databases/$(database)/documents/users/$(request.auth.uid)).isAdmin ||
            get(/databases/$(database)/documents/users/$(request.auth.uid)).data.isAdmin;
        }
        allow read;
        allow create, update, delete: if isAdmin();
    }
  }
}