Как установить правила Firebase Firestore? - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь выяснить, почему мои правила чтения данных из коллекции штриховок не сработают. Идентификатор документа является идентификатором пользователя, который создал документ, а идентификатор пользователя является идентификатором другого пользователя. Я не могу заставить работать разрешения на чтение, поэтому мне интересно, что мне не хватает? Заранее благодарим за помощь.

  rules_version = '2';
    service cloud.firestore {
      match /databases/{database}/documents {

       function isSignedIn() {
              return request.auth != null;
            }

        match /strokedata/{document} {

          allow write: if isSignedIn() && document == request.auth.uid;
          allow read: if document == request.auth.uid || request.auth.uid == resource.data.coachuid; 

           }  

         match /users/{document} {

          allow create: if request.auth.uid != null;
          allow read: if request.auth != null;
          allow write: if document == request.auth.uid; 
      }
    }
  }

Вот код запроса клиента:

self.db.collection("strokedata").whereField("sessionid", isEqualTo:  self.currentsession as Any).addSnapshotListener { (querySnapshot, err) in
if let err = err {


 print("Error getting documents: \(err)")

 } else {

 for document in querySnapshot!.documents {
 print("\(document.documentID) => \(document.data())")

            if let watts = document["watts"], let split =   document["currentsplit"], let time = document["time"], let strokerate = document["strokerate"], let distance = document["distance"]  {

            self.lblCurrentWatts.text = "\(watts)"

            let splitS = split as! Double
            let timestring = splitS.asString(style: .positional)

            let timeS = time as! Double
            let splitstring = timeS.asString(style: .positional)

            self.split500.text = "\(timestring)"
            self.timeElapsedData.text = "\(splitstring)"
            self.strokeRateData.text = "\(strokerate)"

            self.lblDistance.text = "\(distance)m"

            if document["heartrate"] == nil {
            self.heartRateData.text = "\(0)"
                                           } else {
            if let heartrate = document["heartrate"] {
            self.heartRateData.text = "\(heartrate)"

                        }

1 Ответ

0 голосов
/ 01 мая 2020

Ваш запрос не соответствует вашим правилам. В вашем запросе применяется только один фильтр к полю sessionid, но ваши правила требуют, чтобы пользователь мог только читать документы с идентификатором, который соответствует их UID, или документ, чей coachuid соответствует их UID. Поскольку ваш запрос не идентифицирует документ для чтения и не фильтрует с соответствующим значением coachuid, он каждый раз завершается сбоем.

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

...