地图中未知密钥的Firestore安全规则

时间:2020-03-24 18:07:55

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

我正在尝试实施一个Firestore安全规则,该规则将验证在地图内部创建时创建的所有条目。但是,我有一个问题,我不知道地图的键。我有这样的东西:

{
    "name": "Tom",
    "answers": {
        "SomeUUID": {
            "answer": "Alps",
            "right": true
        },
        "AnotherUUID": {
            "answer": "Mount Everest",
            "right": false
        }
    }
}

要使用安全规则验证条目,我会做类似的事情

rules_version = "2"
service cloud.firestore {
  match /databases/{database}/documents { 

  match /answers/{answerID} {  
        allow read;
        allow create: request.resource.data.name is string && request.resource.data.answers is map
  } 

}

如何在不知道地图或键的大小的情况下进一步验证成员地图的内容?是否可以使用通配符作为密钥?每个创建的键的值应相同。我想做这样的事情:

    allow create: request.resource.data.name is string && request.resource.data.answers && 
request.resource.data.member.$(wildcard).keys().size() == 2 && request.resource.data.member.$(wildcard).answer is string && request.resource.data.member.$(wildcard).right is bool

这是否可行,还是需要更改整个逻辑?可能有通配符吗?

1 个答案:

答案 0 :(得分:1)

如果您不知道字段名称,则无法检查其内容。安全规则中没有通配符或迭代器可让您发现随机事物。

如果必须保留此文档结构和验证逻辑,请考虑将文档数据发送到您控制的后端,并使用服务器端逻辑来确定数据是否有效。