【问题标题】:Firebase query, rule for collectiongroup query getting in the wayFirebase 查询,收集组查询规则妨碍
【发布时间】:2020-08-03 07:16:29
【问题描述】:

就在我以为我掌握了窍门的时候,查询规则给了我一个曲线球:(

我有这个查询规则:

// Needed for collection group (Member) query
// https://firebase.googleblog.com/2019/06/understanding-collection-group-queries.html
match /{rootPath=**}/Members/{member} {
    allow read: if request.auth != null;
}

这是非常基本的,只需要授权用户。集合组查询按预期完美运行。

现在,我想进行另一个查询以获取成员文档:

Firebase.firestore.collection("Companies\\$companyID\\Members").get().await()

查询返回错误 (PERMISSION_DENIED)。

我也尝试为这样的成员添加规则:

match /Companies/{companyID} {
    allow read: if request.auth != null &&
                isMember(database, companyID, request.auth.uid)
      
    match /Members/{member} {
        allow read: if request.auth != null 
    }
}

还是一样的错误。

这是文档路径:

我查看了一些资源,但没有看到任何可以提出解决方案的建议:

Understanding Collection Group Queries in Cloud Firestore

Recursive wildcards

【问题讨论】:

  • 您可以尝试使用 Firebase.firestore.collection("Companies\\$companyID\\Members").get().await() 来添加 FieldPath 吗?
  • 抱歉,我不明白这个建议?我看不出您的建议与上面发布的现有代码有何不同。查询有效,显然是安全规则无效。
  • 对不起,我误解了这个问题。问题仍然存在吗?
  • 是的,问题仍未解决

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


【解决方案1】:

我将其发布为答案,因为评论太长了。

您是否尝试过以下示例规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /Companies/{companyID}/Members/{member} {
      allow read, write: if <condition>;
    }
  }
}

如前面documentation you shared 中提到的基于分层数据的结构化规则?

【讨论】:

  • 感谢您的建议,但这不起作用...该规则仅用于读取数据(因此不需要“写入”选项),但也就是说,这是一条规则还必须涵盖集合组查询,并且该建议不符合这些要求。查询会起作用,是的,但集合组查询会失败。
【解决方案2】:

我建议您查看以下documentation,您可以在其中找到一些示例:

service cloud.firestore {
  match /databases/{database}/documents {
    match /Companies/{companyID}/Members/{memberID} {
      // Only authenticated users can read
      allow read: if request.auth != null;
    }
  }
}

使用上述安全规则,任何经过身份验证的用户都可以检索任何单个公司成员

db.collection("Companies/{companyID}/Members").get()

现在,如果您希望将相同的安全规则应用于集合组查询,则必须使用 版本 2

rules_version = '2';
service cloud.firestore {

  match /databases/{database}/documents {
    // Authenticated users can query the posts collection group
    // Applies to collection queries, collection group queries, and
    // single document retrievals
    match /{path=**}/Members/{memberID} {
      allow read: if request.auth != null;
    }
  }
}

任何经过身份验证的用户都可以检索任何单个公司成员

但是,如果您想向某个用户展示他们在所有公司中的成员,该怎么办?您可以使用集合组查询从所有成员集合中检索结果:

  var user = firebase.auth().currentUser;
    
  db.collectionGroup("members").where("author", "==", user.uid).get()

注意:此查询需要成员集合的 composite index。如果您尚未启用此索引,查询将返回一个错误链接,您可以按照该链接创建所需的索引。

【讨论】:

  • 如上所述;该规则适用于 collectionGroup 查询。我遇到的问题是对公司成员文档执行标准查询。我想将查询锁定到特定的 .
【解决方案3】:

您可以尝试使用“match /{path=**}/Members/{member}”代替 rootPath。我没有使用过后者,但前者在其他项目中为我工作过。

【讨论】:

  • 感谢您的建议,但“rootPath”(或在您的情况下为“路径”)只是占位符的名称,它就像一个变量名称,没有区别。
猜你喜欢
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
相关资源
最近更新 更多