我正在尝试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文档中的所有内容。

09-10 06:58
查看更多