Firestore安全规则具有查询权限的“ exists()”

时间:2019-09-03 23:25:02

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

Firestore查询似乎不适用于子集合数据结构。

我的数据库的结构如下:

users
  userUid
    { userData }
  ...
groups
  groupID
    { groupData }
    members
      member1uid
        { memberData }
      ...
    messages
      message1
        { messageData }
      ...

我测试用户是否为某个组成员的规则如下:

function isMemberOfGroup(groupId) {
  return exists(/databases/$(database)/documents/groups/$(groupId)/members/$(request.auth.uid))
}

match /groups/{groupId} {
  allow read: if isMemberOfGroup(groupId)
}


问题是我无法将查询与这些规则一起使用,因为(基于)我无法找到基于子集合是否包含某个文档的查询。这意味着我无法列出某个用户所属的所有组。我尝试仅在groupData一部分的地图中列出所有用户,但是我无法为谁可以编辑文档的某些部分设置权限,因此也无法使用。

编辑: 据我了解,查询必须以某种方式匹配规则,否则权限将被拒绝。我将如何创建一个查询来收集某个用户所在的所有组并满足此规则。

1 个答案:

答案 0 :(得分:1)

Firebase安全规则不会自行过滤数据。相反,它们确定允许哪些读取操作/查询。

因此,如果成员只能读取其所属的组,则类似firebase.firestore().collection('groups').get()的读取将永远无法工作。

您将始终必须在查询中复制“仅成员”逻辑。仅当有关成员资格的数据在文档本身中时,才有可能这样做,因为单个查询/读取只能从单个集合/组中读取。由于您的数据结构中授权所依赖的数据位于不同的集合中,因此,尽管您可以安全地访问各个文档,但我认为您不能安全地查询它。