我目前在设置复杂的Firestore规则方面遇到了很多很多,但到目前为止没有任何工作,如果有人可以提供帮助,我会很高兴。
这是我的根数据库结构:
其中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)?我发现它很混乱,记录不好。在地图上怎么样?同样的事情?
谢谢!
答案 0 :(得分:0)
我花了几周才发现,但我最终想要和工作的是:
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 之间存在差异,我不知道并且正在查杀我的请求,有时会读取,有时写。很高兴它现在有效。