我正在尝试设置Cloud Firestore安全规则,以便仅将ID匹配文档ID的用户授予文档访问权限。 Firebase身份验证用于对用户进行身份验证,并使用用户特定的ID命名文档。 这些文档存储在“用户”集合中。
这是我的规则:
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;
}
}
}
以下是对数据库进行查询的代码:
func loadData () {
//For Database
let userID = Auth.auth().currentUser?.uid
let db = Firestore.firestore()
db.collection("Users/\(userID!)/Info").document("Info").getDocument { (document, error) in
if error == nil {
//No error, check that document exists
if document != nil && document!.exists {
//Load the user data to the view controller
} else {
//Show the error which has occured
print("Document does not exist")
}
} else {
//Show the error which has occured
print("Error loading user data")
}
}
}
由于要查看的其他线程包含的代码完全相同,因此我无法理解这个问题。 Firebase模拟器给我一个错误:“模拟读取被拒绝”和“此匹配的访问被拒绝”。 在Xcode中,我收到错误消息:“ [Firebase / Firestore] [I-FST000001]在Users / DB9wtqM9h0OO1paMjNWAdsF4EgX2上侦听查询失败:缺少权限或权限不足。” 对UID进行硬编码确实可行,因此我认为这与文件路径有关。
请帮助,谢谢!
答案 0 :(得分:0)
您的规则实际上根本不适用于您显示的查询。规则仅将立即匹配Users集合中的文档,例如“ / Users / abc”。您的查询正在访问“用户”中的文档下组织的子集合。
如果要在嵌套在“用户”下的也称为“信息”的任何子集合中匹配ID为“信息”的文档,则规则应如下所示:
match /Users/{userId}/Info/Info {
allow read, update, delete: if request.auth.uid == userId;
allow create: if request.auth.uid != null;
}
请注意文档的路径如何与查询中的文档完全匹配。
如果您想保护主集合下任何子集合中的文档,也可能需要阅读recursive wildcards。