Firestore: Запросы и безопасность (Swift) - PullRequest
0 голосов
/ 26 мая 2018

TL; DR Как выполнить запрос к защищенной коллекции Firestore?

В Firestore есть следующее правило безопасности:

service cloud.firestore {
    match /databases/{database}/documents {
        match /users/{userId} {
          allow read, update, delete: if request.auth.uid == userId;
          allow create: if request.auth.uid != null;
        }    
    }
}

В настоящее время идентификатором документа является userId, и в каждом документе также есть поле с userId.Я могу найти документ, если сразу перейду к определенному документу, используя его идентификатор документа:

let docRef = db.collection("users").document(userId)
docRef.getDocument { (document, error) in
    if let document = document, document.exists {
        let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
        print("Document data: \(dataDescription)")
    } else {
        print("Document cannot be read or does not exist")
    }
}

Однако, если я затем выполню запрос и скажу ему, чтобы он возвращал только те документы, которые в поле userId указаны кактак же, как и текущий пользователь, вошедший в систему, он завершается с ошибкой безопасности «Отсутствует или недостаточно разрешений».

db.collection("users").whereField("userId", isEqualTo: userId).getDocuments() { (querySnapshot, err) in
    if let err = err {
        print("Error getting documents: \(err)")
    } else {
        for document in querySnapshot!.documents {
            print("\(document.documentID) => \(document.data())")
        }
    }
}

Итак, как мне попросить Firestore безопасно найти только те документы, чье поле userId совпадает с зарегистрированным пользователем?userId?

Спасибо.

1 Ответ

0 голосов
/ 26 мая 2018

Это работает:

allow read, update, delete: if resource.data.userId == request.auth.uid;
...