Firebase 规则不适用于子集合文档

时间:2021-01-01 23:31:54

标签: firebase google-cloud-firestore firebase-security

这是我的规则

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /Users/{id}{
        allow read : if (request.auth.uid == resource.data.uid);
      allow write : if false;
    }
    
   
    match /Class/{id}{
        allow read : if (request.auth.uid == resource.data.instructor.uid || (request.auth.uid == resource.data.admin.uid));
     
      allow write : if false;
    }
   
    match /Class/{id}/Topics/{doc} {
             allow read:
       if request.auth.uid == resource.data.topicOwnerUID || request.auth.uid == resource.data.adminUID
        allow write: if false;
        }
    
  }
}

除了尝试从 Class/docs/Topics/docs 中提取所有主题之外,一切都很好。我使用 getDocuments 并尝试使用 limit(50) 获取所有文档,我现在只有 1 个主题,但我也尝试将限制设置为 1 但仍然不起作用..在每个主题文档中,都有一个 adminUID 和一个 topicOwnerUID 字段。当所有者尝试提取所有文档时,我收到错误消息:“错误:权限缺失或不足。”。我检查了一下,所有必填字段都在那里,这应该允许。

编辑:似乎如果我删除 .limit 并只获取具有特定 docID 的单个文档,它就可以工作。但这不是我想要的:/。也许我将不得不将子集合变成它自己的集合。

Edit2:即使它不是子集合也不起作用。完全失去了 rn。看起来唯一的方法是单独获取每个文档,但这会破坏lazyLoading。 Firebase 落后了。将切换到另一个数据库。

1 个答案:

答案 0 :(得分:1)

安全规则在没有匹配查询的情况下没有任何意义——请记住,安全规则不是过滤器——它们不会“只给你允许的记录”——你必须使用查询来匹配你的规则。如果您的查询可能返回规则不允许的文档,则不允许使用整个查询。

我可以从 EXTENSIVE 使用中告诉您,Firebase/Firestore 不会以任何方式落后,而且我一直在使用复杂的查询。

相关问题