我的安全规则存在以下问题:
我有收集教室,里面有教室文件。
首先,当我检查if classroo.owner == request.auth.uid
时,它总是返回false以允许创建/更新/删除,但是当我使用if request.auth.uid in classroomData().userList
时,它会很好地允许读取。
我尝试使用这些安全规则还注意到那些被注释掉的东西-
service cloud.firestore {
match /databases/{database}/documents {
function isSignedIn() {
return request.auth != null;
}
match /classrooms/{classroom} {
allow read: if request.auth.uid in classroomData().userList;
allow update, delete,create: if classroomData().owner == request.auth.uid;
function classroomData() {
return get(/databases/$(database)/documents/classrooms/$(classroom)).data
}
// match /classrooms/{classroom}/tasks/{taskId} {
// allow read: if request.auth.uid in classroomData().userList;
// allow update, delete,create: if parentDoc().owner == request.auth.uid;
// }
}
}
}
和集合-
https://i.stack.imgur.com/Bjh9W.png
某些教室包含与任务相关的文档的子任务集合,我希望用户如果不是父classroom.userList
的一部分并且不能删除/写入/如果他们不是所有者,请更新。
现在我的问题是我无法让我的安全规则生效...
答案 0 :(得分:0)
您在教室文档的所有者字段中拥有的内容看起来像是电子邮件地址,而不是Firebase身份验证UID。这永远不会与request.auth.uid
进行比较。看起来该文档确实在uid字段中具有UID。您可能应该将其用于安全规则,而不是电子邮件地址。
allow update, delete, create: if classroomData().uid == request.auth.uid;
但是由于您正在将UID与安全规则匹配的当前文档进行比较,因此不需要get()该文档。您可以使用resource
访问正在编写的当前文档的属性:
allow update, delete, create: if resource.data.uid == request.auth.uid;
您甚至可以进一步简化。由于write
访问权限与update
,delete
和create
的组合相同,因此您可以编写如下规则:
allow write: if resource.data.uid == request.auth.uid;