无法将安全规则级联到子集合+允许创建不起作用



我的安全规则有以下问题:

我有收藏教室,里面有教室文件。 首先,当我检查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的一部分,则无法阅读任务/教室,如果他们不是所有者,则无法删除/写入/更新。 现在我的问题是我无法让我的安全规则起作用......

您在课堂文档的所有者字段中的内容看起来像是电子邮件地址,而不是 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访问与updatedeletecreate的组合相同,因此可以这样编写规则:

allow write: if resource.data.uid == request.auth.uid;

最新更新