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

问题描述 投票:1回答:1

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

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

  • 我的内容文档看起来像这样; {channelRef:'ccc'}
  • 我的频道文档'channels / ccc'看起来像这样; {管理员:[ '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)=>
{
...

任何帮助非常感谢。

firebase-security google-cloud-firestore
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.