Firestore安全规则-如何为字段名称使用变量?

时间:2018-08-30 20:43:18

标签: firebase google-cloud-firestore firebase-security-rules

如果我的文档保存在/recordTypeX/{autoKey}中,结构如下:

memberUserIds [object]
  hjfjkh32390u09j: true
  kjsklfjkslfklj3: true
  ....
  skfksdjk2249fks: true
someStringField: "Bork, bork, bork!"
someNumericField: 88

如何编写安全规则来检查是否存在memberUserIds?我尝试了以下操作,但是CLI不喜欢该语法。

allow read if resource.data.memberUserIds.$(request.auth.uid) == true;

我知道变量可以在get()exists()的路径中使用,因此我认为也可以使用变量寻址字段,但是我无法克服语法错误。这可能吗?

在某些背景下,我试图在集合中的每个文档上维护一个(小的)userId列表,以便我可以执行一些查询,以使我可以检索集合中当前用户是其成员的所有文档。的。

我在查看了名为使用列表,集合和数组的指南后采用了这种方法,该指南过去在Firebase文档中可用,但似乎已被删除。

感谢您的任何想法。

1 个答案:

答案 0 :(得分:5)

这是我的基本火力规则之一。

function containsResourceOwnerId() {
    // /database/{database}/documents/example/{exampleId}
    // exampleDocument => { abc123: true }, request.auth.uid = abc123
    return resource.data[request.auth.uid] == true;
}

您应该可以使用以下内容

function isMemberOf() {
    return resource.data.memberUserIds[request.auth.uid] == true;
}

在需要的地方使用规则。

match /teams/{teamsId} {
    allow read: if isMemberOf();