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

问题描述 投票:0回答:1

我的安全规则存在以下问题:我有收集教室,里面有教室文件。首先,当我检查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的一部分,则无法阅读任务/教室,如果不是,则不能删除/写入/更新主人。现在我的问题是我无法让我的安全规则生效...希望你们能帮助我! :D

感谢进阶...

android google-cloud-firestore firebase-security-rules
1个回答
0
投票

您在教室文档的所有者字段中拥有的内容看起来像是电子邮件地址,而不是Firebase身份验证UID。这永远不会与request.auth.uid相提并论。看起来该文档确实在uid字段中具有UID。您可能应该将其用于安全规则,而不是电子邮件地址。

allow update, delete,create: if classroomData().uid == request.auth.uid;

但是由于您正在将UID与安全规则匹配的当前文档进行比较,因此不需要get()该documnet。您可以使用resource访问正在编写的当前文档的属性:

allow update, delete,create: if resource.data.uid == request.auth.uid;

您可以进一步简化。由于write访问与updatedeletecreate的组合相同,因此可以编写如下规则:

allow write: if resource.data.uid == request.auth.uid;
© www.soinside.com 2019 - 2024. All rights reserved.