如何为非平凡访问创建firestore安全规则

时间:2017-12-17 18:40:32

标签: firebase-security google-cloud-firestore

我有一个用例,其中包含频道,用户和内容类型的文档,例如一些博客。

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有时因某种原因而失败..)

  • 我的内容文档如下所示; {channelRef:'ccc'}
  • 我的频道文件'频道/ ccc'看起来像这样; {admins:['uuu']}
  • 用户的uid是'uuu'

我还尝试在频道下为管理员使用子集合,其中路径看起来像'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)=>
{
...

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

所以,看起来我是个傻瓜:)。我已经来回编辑代码这么长时间我没有看到我的类型;我一直在查询内容'而不是'内容'。 Aaaargh。所以无论如何 - 上面的安全规则运行良好,现在我对firestore没有进一步的麻烦。谢谢你,晚安