鉴于以下规则:
{
"rules": {
"users": {
"$uid": {
"name":{
".read": "auth != null && auth.uid == $uid",
".write": "auth != null && auth.uid == $uid"
}
}
}
}
}
Firebase中是否有办法限制可写入对象的子项?
例如,我想限制客户端只用一个属性编写这个对象:
name {
"value": "value"
}
我知道有.validate
和hasChildren()
,但它不会阻止用户合法地在$ uid下使用不需要的属性编写对象。
没有什么阻止客户端编写对象,如下所示:
name {
"value":"value",
"unwantedAttribute":"wastingSpace"
}
是否等同于hasThoseChildrenOnly()
?
答案 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的回答非常有帮助,但我还想指出一件事。
规则以原子方式应用。这意味着如果在该位置或父位置没有规则授予访问权限,则读取或写入操作会立即失败。即使可以访问每个受影响的子路径,在父位置读取也将完全失败。
因此,最好在父节点上声明.read
和.write
权限。