Firebase数据库规则:如何防止某个子项被删除(a.k.a NOT NULL)?

时间:2017-05-03 18:37:44

标签: firebase firebase-realtime-database firebase-security

我正在尝试在firebase中定义一个模式,该模式将阻止某些子属性为空(如SQL中的NOT NULL约束)。

架构应如下所示:

Property | allow null | type
---------+------------+--------
name     | false      | string
phone    | false      | string
alias    | true       | string
birthday | true       | number (timestamp) 

此外,只有用户自己应该能够读写自己的联系人。

目前,数据库中有一些虚拟数据:

{
  "contacts" : {
    "user1" : {
      "contact1" : {
        "alias" : "Bobby",
        "name" : "Bob",
        "phone" : "12312324"
      }
    }
  }
}

我提出的解决方案如下:

{
  "rules": {
    "contacts": {
      "$user": {
        "$contact": {
          ".read": "auth.uid == $user",
          ".write": "auth.uid == $user && newData.hasChildren(['name', 'phone'])",
          "name": {
            ".validate": "newData.isString()"
          },
          "phone": {
            ".validate": "newData.isString()"
          },
          "alias": {
            ".validate": "newData.isString()"
          },
          "birthday": {
            ".validate": "newData.isNumber()"
          },
          "$other": {
            ".validate": "false"
          }
        }
      }
    }
  }
}

这种方法的问题是每次我想要修补某个值(例如别名)时,由于newData.hasChildren(['name', 'phone'],我必须提供非空属性(未更改)规则。

虽然我可以访问我的应用中的整个对象,但这是一个恼人的不便。

有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

  

这种方法的问题在于,每次我想要修补某个值(例如别名)时,由于{{1},我必须提供非空属性(不会被更改)规则。

您似乎误解了newData.hasChildren(['name', 'phone']在规则中的含义。来自reference documentation of newData

  

newData对应于如果允许写入将导致的数据

因此,如果只将一个属性写入已包含所有属性的位置,则RuleDataSnapshot变量将包含所有属性:未指定属性的现有值,以及属性的新值&# 39;重写。