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

标签 android google-cloud-firestore firebase-security

我的安全规则存在以下问题:

我有收藏教室,里面有教室文件。 首先,当我检查 if classroo.owner == request.auth.uid 时,它总是返回 false 以允许创建/更新/删除,但是当我使用 if request.auth.uid 执行此操作时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;
        //  }
    }
  }
}

和集合-

/image/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;

关于android - 无法让安全规则级联到子集合+允许创建不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58458552/

相关文章:

java - Java 中的 Array List Intent extra

android - Gradle Kotlin DSL 的 versionCodeOverride 等价物

android - 子 fragment 无缘无故被销毁

firebase - Firestore 云功能,在文档创建中添加作者的 UID

firebase - 将 Firestore 安全规则集 () 转换为字符串值

node.js - Firestore 触发的云功能参数的类型?

firebase - 服务帐号的 Firestore 服务规则

android - 计算建筑物内的距离

javascript - 将时间戳与 00 :00:00 of today? 进行比较的 Firebase 数据库规则

google-cloud-firestore - 在 Firestore 安全规则中,如何将数组值与映射键进行比较?