只有子级。编写规则[Firebase]

只有子级。编写规则[Firebase],firebase,Firebase,鉴于以下规则: { "rules": { "users": { "$uid": { "name":{ ".read": "auth != null && auth.uid == $uid", ".write": "auth != null && auth.uid == $uid" }

鉴于以下规则:

   {
    "rules": {
        "users": {
           "$uid": {
              "name":{
                ".read": "auth != null && auth.uid == $uid",
                ".write": "auth != null && auth.uid == $uid"
              }
           }
        }
      }
    }
Firebase中是否有方法限制可以写入对象的子对象

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

name {
  "value": "value"
}
我知道有
.validate
haschilds()
但是这并不妨碍用户合法地在$uid下写入具有不需要的属性的对象

没有任何内容阻止客户端按如下方式写入对象:

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

是否有一个等价于hasshosechildrenonly()?

一个
。write
规则决定了谁可以将数据写入一个位置,而不是他们可以写入什么数据

要确定写入的数据的结构,需要一个
.validate
规则。在这种情况下,您可以说需要一个
名称
,它必须是一个包含以下内容的字符串:

{
  ".validate": "newData.hasChild('name')",
  "name": {
    ".validate": "newData.isString()"
  },
  "$other": {
    ".validate": false
  }
}
顶层的验证确保新数据必须始终具有
名称
属性。如果没有此选项,您可以删除
名称
,因为删除数据不会触发验证

第二次验证确保
name
是一个字符串


第三次验证确保除
名称
之外的任何子项都将被拒绝。

写入规则决定了谁可以将数据写入某个位置,而不是他们可以写入什么数据

要确定写入的数据的结构,需要一个
.validate
规则。在这种情况下,您可以说需要一个
名称
,它必须是一个包含以下内容的字符串:

{
  ".validate": "newData.hasChild('name')",
  "name": {
    ".validate": "newData.isString()"
  },
  "$other": {
    ".validate": false
  }
}
顶层的验证确保新数据必须始终具有
名称
属性。如果没有此选项,您可以删除
名称
,因为删除数据不会触发验证

第二次验证确保
name
是一个字符串


第三次验证确保除了名字以外的任何孩子都会被拒绝。

@Frank van Puffelen的回答确实很有帮助,但我想指出一件事

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


因此,最好在您的父节点上声明
、读取
、写入
权限。

@Frank van Puffelen的回答非常有用,但我想指出一点

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

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