我有一个用例,其中包含频道,用户和内容类型的文档,例如一些博客。
TL; DR:我需要帮助创建一个规则,让多个用户可以访问对文档子集(如“管理员”)进行查询。不只是一个用户,而不仅仅是所有文档。
用户可以将其uid作为Channel文档的“admins”map属性的一部分,然后用户才能编辑属性。以下规则适用于此;
match /channels/{channelId=**} {
allow read, write: if request.auth.uid in get(/databases/$(database)/documents/channels/$(channelId)).data.admins;
}
当将内容添加到频道时,我唯一能够工作的是将内容对象添加到频道文档中的数组中。我想使用firestore查询,当然我已经尝试在通道对象和单独的根集合下使用子集合,我无法构建安全规则。
规则应匹配其uid是渠道文档上admins map属性成员的用户,以允许读取和写入内容对象。
内容对象有一个'channelRef'属性,该属性包含通道文档的id,其admins map属性应该与request.auth对象的uid匹配。
我最后一次尝试很多是以下规则;
match /content/{contentId=**} {
allow read, write: if exists(/databases/$(database)/documents/channels/$(get(/databases/$(database)/documents/content/$(contentId)).data.channelRef)/admins/$(request.auth.uid));
}
我正在尝试使用get()来强制获取对内容文档的引用(因为resource.data.xxxx有时因某种原因而失败..)
我还尝试在频道下为管理员使用子集合,其中路径看起来像'channels / ccc / admins / uuu'并使用exists()代替。没有骰子。
我已经验证我可以通过直接引用访问内容文档(例如使用firestore.doc('content / 123')..)但不使用查询。此外,集合中只有一个内容文档,因此查询不可能遇到另一个不允许的文档。
查询看起来像这样(类型为'content',属性'channelRef'和值'ccc';
let ref = firestore.collection(this.type)
let query = ref.where(this.property, this.operation, this.value)
query.onSnapshot((res)=>
{
...
非常感谢任何帮助。
答案 0 :(得分:0)
所以,看起来我是个傻瓜:)。我已经来回编辑代码这么长时间我没有看到我的类型;我一直在查询内容'而不是'内容'。 Aaaargh。所以无论如何 - 上面的安全规则运行良好,现在我对firestore没有进一步的麻烦。谢谢你,晚安