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
一部分的地图中列出所有用户,但是我无法为谁可以编辑文档的某些部分设置权限,因此也无法使用。
编辑: 据我了解,查询必须以某种方式匹配规则,否则权限将被拒绝。我将如何创建一个查询来收集某个用户所在的所有组并满足此规则。
答案 0 :(得分:1)
Firebase安全规则不会自行过滤数据。相反,它们确定允许哪些读取操作/查询。
因此,如果成员只能读取其所属的组,则类似firebase.firestore().collection('groups').get()
的读取将永远无法工作。
您将始终必须在查询中复制“仅成员”逻辑。仅当有关成员资格的数据在文档本身中时,才有可能这样做,因为单个查询/读取只能从单个集合/组中读取。由于您的数据结构中授权所依赖的数据位于不同的集合中,因此,尽管您可以安全地访问各个文档,但我认为您不能安全地查询它。