我有一个用例,我有类似频道,用户和内容类型的文档,例如一些博客。
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属性成员的用户,以允许读取和写入内容对象。
content对象有一个'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)=>
{
...
任何帮助非常感谢。
所以,看起来我是一个彻头彻尾的傻瓜:)。我已经来回编辑代码这么长时间我没有看到我的类型;我一直在查询“内容”而不是“内容”。 Aaaargh。所以无论如何 - 上面的安全规则运行良好,现在我对firestore没有进一步的麻烦。谢谢,晚安