【问题标题】:Firebase rules not applying to subcollection documentsFirebase 规则不适用于子集合文档
【发布时间】:2021-01-01 23:31:54
【问题描述】:

这是我的规则

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 落后了。将切换到另一个数据库。

【问题讨论】:

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


    【解决方案1】:

    如果没有匹配的查询,安全规则就没有任何意义 - 请记住,安全规则不是过滤器 - 它们不会“只为您提供允许的记录” - 您必须使用查询来匹配您的规则。如果您的查询可能返回规则不允许的文档,则整个查询将被禁止。

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

    【讨论】:

    • 我在 getDocuments 之前在我的前端添加了查询,但它仍然不起作用。如果我必须摆脱安全规则并允许所有人读取,那会不会是一个巨大的安全风险?
    • 我解决了。如果他们添加一个 OR 运算符来比较字符串会很高兴。
    • 最接近 OR 操作的是(非常)最近添加的“in”运算符,它允许您检查该字段是否是数组中的任何条目。最多 10 个元素除此之外,它需要多次查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 2020-02-02
    • 2019-10-15
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多