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;
}
}
}
目前,文档ID是userId,每个文档中还有一个带有userId的字段。如果我使用文档ID直接访问特定文档,我可以找到该文档:
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字段与当前登录用户相同的文档,那么它将失败并且#34;缺少权限或权限不足"安全错误。
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匹配的文档?
感谢。
答案 0 :(得分:0)
这有效:
allow read, update, delete: if resource.data.userId == request.auth.uid;