我有一个名为UserProfiles的Firestore集合,该集合将每个用户的个人资料信息存储在单独的文档中。每个文档均以其所属用户的用户ID命名。每个文档还包含许多子集合。我想制定规则,使每个用户只能读取和写入自己的文档及其子集合。但是,当用户尝试阅读其个人资料文档时,我不断收到以下错误消息:
获取文档时出错:域= FIRFirestoreErrorDomain代码= 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
基本上,我想对自己的规则执行的操作是给登录用户提供其自己的个人资料文档(即具有其用户ID(FHEneuY3nron3Ns2Ndl1SGdg9Nsw)的名称)以及其下的子集合(UserHistory,UserReports和UserLogs),但不允许用户读取或写入其他用户的个人资料文档或其子集合。
然后将结果输出到控制台:
用户ID为FHEneuY3nron3Ns2Ndl1SGdg9Nsw
2020-05-26 18:53:58.560680-0400 MealFleet [2495:1086294] 6.2.0-[Firebase / Firestore] [I-FST000001]在UserProfiles上侦听查询失败:缺少权限或权限不足。 在功能视图中获取文档时出错,使用用户ID FHEneuY3nron3Ns2Ndl1SGdg9Nsw出现:错误域= FIRFirestoreErrorDomain代码= 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)")
}
}
答案 0 :(得分:2)
您的查询与您的规则不符。您的查询正在尝试过滤文档字段user_id
等于某个字符串self.userUId
的所有文档。您的规则要求用户只能访问UserIDs中单个ID匹配其UID的特定文档。这些根本不是一回事。
如果您希望代码访问用户的特定文档,则它根本不应使用whereField
。只需使用ID即可获取单个文档。
db.collection("UserProfiles").document(self.userUId).getDocument()
请参阅getting a document的文档。