如何使复杂的Firestore规则与地图和列表一起正常工作?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使复杂的Firestore规则与地图和列表一起正常工作?相关的知识,希望对你有一定的参考价值。

我目前在设置复杂的Firestore规则时遇到了很多麻烦,但到目前为止没有任何工作,如果有人可以提供帮助,我会很高兴。

这是我的根数据库结构:

  • user_access
  • 会议

其中user_access具有电子邮件地址作为密钥,并且具有groupId的对象/列表/值(稍后更多),他可以访问,然后是权限级别。每次会议都有一个groupId(它所属的地方)。

所以,我想要一个规则:检查来自会议的当前groupId值是否在user_access文档中,当前电子邮件地址为关键。

我考虑过这个规则(简化如下):

service cloud.firestore {
      match /databases/{database}/documents {
          match /meetings/{meetingId} {

          function correctUser() {
            return get(/databases/$(database)/documents/access/$(request.auth.token.email)).data.obj[get(/databases/$(database)/documents/meetings/$(meetingId)).data.groupId] == "leader" 
          }

          allow read: if correctUser();
          allow write: if correctUser();
     }
}

但它不起作用..而且我不确定为什么。

我试过制作一个清单:

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? (......)。数据[$(meetingId)?我发现它很混乱,记录不好。在地图上怎么样?一样?

谢谢!

答案

我花了几周时间才发现,但我最终想要和工作的是:

 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.groupId和resource.data.groupId之间有区别,我不知道并且正在查杀我的请求,有时读,有时写。很高兴现在有效。

以上是关于如何使复杂的Firestore规则与地图和列表一起正常工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何在firestore中显示地图列表并在颤动中显示它们

如何创建搜索栏和列表(使用 FireStore 中的 StreamBuilder 和 Listview 创建)一起滚动?

使用 StreamBuilder 获取 Firestore 文档,其中包含颤动中的地图列表

如何使用Java中的地图应用Consumer?

Flutter web:从 Firestore 地图检索的值在添加到列表时被截断

如何使 URL 重写与 web.Release.config 转换一起工作?