Правило безопасности Firestore для предоставления пользователю разрешений на чтение / запись для документа и его вложенной коллекции не работает - PullRequest
0 голосов
/ 26 мая 2020

У меня есть коллекция Firestore с именем UserProfiles, в которой хранится информация о профиле каждого пользователя в отдельных документах. Каждый документ назван по идентификатору пользователя, которому он принадлежит. Каждый документ также содержит несколько вложенных коллекций. Я хотел бы создать правила, дающие каждому пользователю возможность читать и писать свой собственный документ и вложенные коллекции ТОЛЬКО под его документом. Однако, когда пользователь пытается прочитать документ своего профиля, я продолжаю получать следующее сообщение об ошибке:

Ошибка при получении документов: Error Domain = FIRFirestoreErrorDomain Code = 7 «Отсутствуют или недостаточно разрешений». UserInfo = {NSLocalizedDescription = Отсутствуют или недостаточно разрешений.}

Вот созданное мной правило:

service cloud.firestore {
  match /databases/{database}/documents {
    //grant users read and write access to anything under own profiles collection
    match /UserProfiles/{userId}/{document=**} {
      allow read, write: if request.auth.uid == userId;
    }
    //grant users read and write access to their own profile document
    match /UserProfiles/{userId} {
      allow read, write: if request.auth.uid == userId;
    }
  }
}

Благодарен, если кто-нибудь может указать, где я ошибся - Спасибо !

РЕДАКТИРОВАТЬ: Извините - вот код на стороне клиента в Swift:

    let firebaseAuth = Auth.auth()

    if firebaseAuth.currentUser != nil {

      userUId = Auth.auth().currentUser!.uid
      print("User id is \(String(describing: userUId))")

    } else {

      print("User is not currently logged in")

            return
    }

    //Getting my user info
    db.collection("UserProfiles").whereField("user_id", isEqualTo: self.userUId).getDocuments() { (snapshot, error) in
      if let error = error {

        print("Error getting documents in func viewWIllAppear with user id \(self.userUId): \(error)")

      } else {

        print("Successful db connection")
        for document in snapshot!.documents {

          self.myUserHandle = document["user_handle"]! as! String

          print("Retrieved user handle is \(self.myUserHandle)")


        }


      }


    }

И структура базы данных:

UserProfiles
    |
    |--FHEneuY3nron3Ns2Ndl1SGdg9Nsw
           |
           |--UserHistory
           |
           |--UserReports
           |
           |--UserLogs

В основном то, что я хочу для выполнения моих правил необходимо предоставить зарегистрированному пользователю права на чтение и запись в его собственном документе профиля, который представляет собой имена с его идентификатором пользователя (FHEneuY3nron3Ns2Ndl1SGdg9Nsw), а также для вложенных коллекций под ним (UserHistory, UserReports и UserLogs), но не разрешать пользователям для чтения или записи в документы профиля другого пользователя или их подколлекции.

А вот результат вывода на консоль:

идентификатор пользователя - FHEneuY3nron3Ns2Ndl1SGdg9Nsw

2020 -05-26 18: 53: 58.560680-0400 MealFleet [2495: 1086294] 6.2.0 - [Firebase / Firestore] [I-FST000001] Не удалось прослушать запрос в UserProfiles: отсутствует или отсутствует необходимые разрешения. Ошибка получения забавных документов c viewWIllAppear с идентификатором пользователя FHEneuY3nron3Ns2Ndl1SGdg9Nsw: Error Domain = FIRFirestoreErrorDomain Code = 7 «Разрешения отсутствуют или недостаточно». UserInfo = {NSLocalizedDescription = Отсутствующие или недостаточные разрешения.}

ОБНОВЛЕНИЕ: вот исправленный запрос, благодаря Дугу за указание на мою ошибку:

db.collection("UserProfiles").document(self.userUId).getDocument() { (document, error) in
      if let document = document, document.exists {
        let dataDescription = document.data()
        self.myUserHandle = (dataDescription!["user_handle"] as? String)!
        print("Retrieved user handle is \(self.myUserHandle)")
      } else {
        print("Error getting documents in func viewWIllAppear with user id \(self.userUId): \(error)")
      }
    }

1 Ответ

2 голосов
/ 27 мая 2020

Ваш запрос не соответствует вашим правилам. Ваш запрос пытается отфильтровать все документы, в которых поле документа user_id равно некоторой строке self.userUId. Ваши правила требуют, чтобы пользователь мог получить доступ только к одному определенному документу c в UserProfiles, где идентификатор документа совпадает с их UID. Это совсем не одно и то же.

Если вы хотите, чтобы ваш код имел доступ к документу, указанному пользователем, c, тогда он вообще не должен использовать whereField. Ему просто нужно получить отдельный документ с его идентификатором.

db.collection("UserProfiles").document(self.userUId).getDocument()

См. Документацию для получения документа .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...