【发布时间】:2019-09-03 23:25:02
【问题描述】:
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 一部分的地图中列出所有用户,但我无法设置谁可以编辑文档的某些部分的权限,因此这也不起作用。
编辑: 据我了解,查询必须以某种方式匹配规则,否则权限将被拒绝。我将如何创建一个查询来收集某个用户所在的所有组并满足此规则。
【问题讨论】:
-
我不清楚什么没有按您期望的方式工作。您是否有特定的 sn-p 代码 - 特定用例?此外,很高兴看到一套完整的规则,而不仅仅是一个功能。代码和规则总是相辅相成的。
-
@DougStevenson 我不断收到
Missing or insufficient permissions,我什至不知道该尝试什么。 -
假设安全规则允许所有访问,您会使用什么查询?从你所展示的内容中我不清楚。请记住,您的数据库结构可能不适合您想要使用的查询和规则。
-
听起来你应该重新表述这个问题,试图获取你想要的数据,而不是安全规则的问题。我建议先解决数据模型和查询,然后再考虑安全规则。
-
如果成员只能阅读他们所属的组,那么像
firebase.firestore().collection('groups').get()这样的阅读将永远不会起作用。 Firebase 安全规则不会自行过滤数据。相反,它们确定允许哪些读取操作/查询。因此,您将始终必须在查询中复制“仅限成员”逻辑,这只有在有关成员资格的数据在文档本身中时才有可能(因为单个查询/读取只能从单个集合/组中读取)。
标签: firebase google-cloud-firestore firebase-security