只有孩子.write规则[Firebase]

时间:2016-04-21 23:04:22

标签: firebase

鉴于以下规则:

   {
    "rules": {
        "users": {
           "$uid": {
              "name":{
                ".read": "auth != null && auth.uid == $uid",
                ".write": "auth != null && auth.uid == $uid"
              }
           }
        }
      }
    }

Firebase中是否有办法限制可写入对象的子项?

例如,我想限制客户端只用一个属性编写这个对象:

name {
  "value": "value"
}

我知道有.validatehasChildren(),但它不会阻止用户合法地在$ uid下使用不需要的属性编写对象。

没有什么阻止客户端编写对象,如下所示:

name {
  "value":"value",
  "unwantedAttribute":"wastingSpace"
}

是否等同于hasThoseChildrenOnly()

2 个答案:

答案 0 :(得分:3)

.write规则确定可以将数据写入某个位置,而不是他们可以写入的数据。

要确定所写数据的结构,您需要.validate规则。在这种情况下,您可以说name是必需的,并且必须是包含以下内容的字符串:

{
  ".validate": "newData.hasChild('name')",
  "name": {
    ".validate": "newData.isString()"
  },
  "$other": {
    ".validate": false
  }
}

顶级验证可确保新数据必须始终具有name属性。如果没有这个,您可以删除name,因为删除数据不会触发验证。

第二次验证可确保name为字符串。

第三次验证可确保拒绝name以外的任何孩子。

答案 1 :(得分:0)

@Frank van Puffelen的回答非常有帮助,但我还想指出一件事。

来自the Firebase documents

  

规则以原子方式应用。这意味着如果在该位置或父位置没有规则授予访问权限,则读取或写入操作会立即失败。即使可以访问每个受影响的子路径,在父位置读取也将完全失败。

因此,最好在父节点上声明.read.write权限。