如何使用安全规则验证Firestore文档中所有密钥的值更改?

时间:2020-08-07 23:55:41

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

我有一个轮询应用程序,其中每个极点都具有以下结构-

topic: Topic
questions 
{
  Q1
  {
    name: "q1"
    type: "Single Choice"
    options: ["Yes", "No"]
  }
  Q2
  {
    name: "Q2"
    type: "MCQ"
    options: ["A", "B", "C"]
  }
  Q3
  {
    name: "Q3"
    type: "LongAnswer"
    options: null
  }
}

民意调查结果文件如下-

{
  "Q2": {
    "A": 3,
    "C": 6,
    "B": 3
  },
  "Q3": {
    "Responses": [
      "This is my response."
    ]
  },
  "Q1": {
    "No": 2,
    "Yes": 4
  }
}

我需要写下一个安全规则,以确保如果问题属于“单选”类型,则用户只能在值中增加1,并且不能更改多个值。但是,事先不知道问题或选项的数量,并且安全规则不允许循环。我该怎么办?

2 个答案:

答案 0 :(得分:1)

除非您提前知道每个问题的结构,否则这不可能。相反,您应该通过后端发送投票,这样您就可以更灵活地检查自己的内容,并且只编写满足要求的更新。

答案 1 :(得分:1)

正如您发现的那样,您无法在安全规则中做任何“类似”的事情。

因此,您需要更改数据模型以允许用例。由于您说用户只能执行一次操作,因此,您应该使用UID作为密钥:

responses: {
  $uid: "thing they voted on"
}

然后,我建议使用Cloud Functions来计算结果。在上述数据结构上使用ServerValue.increment()和安全规则可能会强制执行 ,但最终会变得相当复杂。