我正在尝试Firebase
并对security rules感到好奇。
假设您有一个表示为以下内容的Firebase数据集:
{
"myNewData" : "Some String"
}
您如何编写规则,以使仅要写入的对象具有键名
myNewData
?我正在使用
POST
方法,数据在Firebase中的结构如下:-myFireBaseapp
-someData
-RandomFirebaseKey
-myNewData
-RandomFirebaseKey
-myNewData
在我想到的模拟器中
{
"rules": {
".read":true,
"$someData":{
".write":true,
".validate": "newData.hasChild('myNewData')"
}
}
}
在模拟器中有效,但在邮递员中无效。
POST
http://myfirebase.app.bucket/someData.json
{
"myNewData" : "Some String"
}
感谢您提供任何信息。
最佳答案
如果您希望数据始终具有带任意值的键/someData/<anyKey>/myNewData
,则可以使用
{
"rules": {
".read":true,
"someData":{
"$anyKey": {
".write":true,
".validate": "newData.hasChild('myNewData')"
}
}
}
}
如果您起眼睛,仍然可以在这些规则
/someData/$anyKey/myNewData
中看到路径。如果您还想验证
myNewData
的值是一个字符串,则可以将规则扩展为:{
"rules": {
".read":true,
"someData":{
"$anyKey": {
".write":true,
".validate": "newData.hasChild('myNewData')",
"myNewData": {
".validate": "data.isString()"
},
"$other": {
".validate": false
}
}
}
}
}
我还在最后一个示例中添加了
"$other: { ".validate": false }
,以确保使用任何未指定键的写入均被拒绝。因此,现在/someData/$anyKey
只能包含一个字符串的myNewData
属性。我强烈建议您学习Using $ Variables to Capture Path Segments上Firebase文档中的所有内容。