【问题标题】:Getting document data from collections - with firestore security rules从集合中获取文档数据 - 使用 Firestore 安全规则
【发布时间】:2020-12-26 04:06:21
【问题描述】:

我在 Firestore 中创建规则时遇到问题。

这是我的例子: 集合 "users" -> many docs -> 不是每个文档 里面都有名为 "recipes" 的子集合。 如果子集合“食谱”存在,那么它有包含一些数据的文档。 其中之一是布尔类型的“public”。

我的问题: 如果“公共”条件为真,我想从所有用户那里获取所有食谱。

我在规则上堆叠:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow read: if request.auth != null && request.auth.uid == userId;
      allow write: if request.auth != null && request.auth.uid == userId;
      match /recipes/{recipeId} {
            allow read: if resource.data.public == "true";
        }
    }
  }
}

它向我显示:错误:simulator.rules 行 [9],列 [21]。空值错误。

在这种情况下,我应该如何使用干净的 javascript 获取/调用这些数据? 如果我只是得到一些脚本,比如 firebase.firestore() 或 firebase.auth()。

【问题讨论】:

  • 问题描述对我来说不是很清楚。如果您显示实际的文档内容,以及在特定情况下规则应允许或拒绝的客户端代码中的查询,将会更有帮助。
  • 我编辑了帖子。您可以查看照片和代码
  • 我想以公开的方式展示每个食谱。用户/查看者是否登录/验证都没有关系。
  • 您可以使用 where 子句对查询进行过滤。根据查询文档,这非常简单。规则不会为您过滤结果。
  • @Doug 你能分享一下上面提到的文档吗?

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


【解决方案1】:

对于那些他们正在寻找解决方案的人。我找到了一个! 让我解释一下:

  1. 我找到了https://firebase.google.com/docs/firestore/security/rules-query关于查询规则的文档。
  2. 然后我决定使用firebase.firestore().collectionGroup('recipes').get().then(...)...
  3. 我的安全码如下:
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{path=**}/recipes/{document} {
      allow read: if resource.data.public == true;
    }
  }
}
  1. 我的 javascript 调用看起来像:
firebase.firestore().collectionGroup('recipes').where('public', '==', true).get().then(recipes => {
  recipes.forEach(doc => {
    console.log(doc.data());
  })
});
  1. 之后我可以在我的 console.log 中看到错误:AILED_PRECONDITION: The query requires an index. You can create it here 或熟悉的链接!
  2. 我点击了链接,然后接受了 collectionGroup 的索引设置。
  3. 您也可以在这里找到它:

抱歉我的英语不好和 Polski język,但我认为我做对了! 所以它帮助我获得了 onlz 公开食谱!

【讨论】:

    【解决方案2】:

    您无法使用安全规则过滤结果。如果有 一个 或更多文档违反规则,安全规则将阻止您的请求。你需要的是collection group queries。例如:

    const querySnapshot = await db.collectionGroup('recipes').where('public', '==', true).get();
        querySnapshot.forEach((doc) => {
            console.log(doc.id, ' => ', doc.data());
    });
    

    【讨论】:

    • 是的,我找到/发现了它 :)
    猜你喜欢
    • 2019-10-15
    • 2018-09-26
    • 1970-01-01
    • 2020-06-19
    • 2021-07-17
    • 2020-07-07
    • 1970-01-01
    • 2020-06-09
    • 2021-06-22
    相关资源
    最近更新 更多