Firebase 如何使复杂的Firestore规则与地图和列表配合使用?

Firebase 如何使复杂的Firestore规则与地图和列表配合使用?,firebase,firebase-security,google-cloud-firestore,Firebase,Firebase Security,Google Cloud Firestore,目前,我在制定复杂的Firestore规则方面遇到了很多麻烦,但到目前为止,一切都不顺利,如果有人能帮我,我会很高兴的 这是我的根数据库结构: 团体 用户访问 会议 其中,user_access将电子邮件地址作为键,以及一个对象/列表/值(稍后将详细介绍)和他可以访问的groupId,后跟权限级别。 每个会议都有一个groupId(它所属的位置) 因此,我希望有一个规则:检查来自会议的当前groupId值是否在user_access的文档中,并将当前电子邮件地址作为密钥 我考虑过这样做(简化

目前,我在制定复杂的Firestore规则方面遇到了很多麻烦,但到目前为止,一切都不顺利,如果有人能帮我,我会很高兴的

这是我的根数据库结构:

  • 团体
  • 用户访问
  • 会议
其中,user_access将电子邮件地址作为键,以及一个对象/列表/值(稍后将详细介绍)和他可以访问的groupId,后跟权限级别。 每个会议都有一个groupId(它所属的位置)

因此,我希望有一个规则:检查来自会议的当前groupId值是否在user_access的文档中,并将当前电子邮件地址作为密钥

我考虑过这样做(简化如下):

但是它不起作用。。我不知道为什么

我试着列一个清单:

function correctUser() {
      return get(/databases/$(database)/documents/meetings/$(meetingId)).data.groupId in get(/databases/$(database)/documents/access/$(request.auth.token.email)).data.list
}
但它也不起作用,我不知道为什么

最好的情况是使用对象列表(映射)、键(id)、值(权限)。可能吗?最坏的情况是,我可以为每个不同的权限使用一个列表,甚至可以将所有ID作为值(我可能永远不会达到20k字段限制)

因此,我有两个问题:

  • 首先,我如何使我的规则生效

  • 其次,如何从字段内部调用通配符中的值?例如,在上面带有{meetingId}的示例中,如何使用此meetingId作为密钥?(…).data.meetingId?(…).数据[$(会议ID)]?我发现它非常混乱,而且记录得很糟糕。在地图上呢?同样的事情


谢谢

我花了数周时间才找到答案,但我最终想要和工作的是:

 function isLeader() {
        return get(/databases/$(database)/documents/access/$(request.auth.token.email)).data[request.resource.data.groupId] == "leader"
        || get(/databases/$(database)/documents/access/$(request.auth.token.email)).data[resource.data.groupId] == "leader"
    }

request.resource.data.groupIdresource.data.groupId之间存在差异,我不知道它们,并且正在终止我的请求,有时读取,有时写入。很高兴它现在能工作。

看起来您正在定义自定义函数,但从未调用它们。如果你是,请更完整地展示你这样做的规则。嘿,道格!我可能把上面的内容简化得太多了,但我正在打电话。这是完整规则:。您还可以告诉我如何正确地从字段中调用通配符(上面的第二个问题)?谢谢你能解释一下区别吗?现在Firestore上有了模拟器,调试起来就容易多了。resource引用数据库中已有的文档,而Request.resource引用新文档,即入站数据。我够清楚了吗?
 function isLeader() {
        return get(/databases/$(database)/documents/access/$(request.auth.token.email)).data[request.resource.data.groupId] == "leader"
        || get(/databases/$(database)/documents/access/$(request.auth.token.email)).data[resource.data.groupId] == "leader"
    }