使用Firebase以编程方式生成的密钥对Firebase数据进行验证

时间:2018-12-03 20:18:25

标签: firebase firebase-realtime-database firebase-security-rules

我正在使用React和Firebase做一个简单的图书管理器应用程序。用户可以输入书的作者,书名和等级,而我正在尝试验证输入内容。

数据的结构如下:

"books" : {
    "-LSon2JjuqUWb6tXV-EA" : {
      "author" : "Stephen King",
      "rating" : "5",
      "title" : "\"Misery\""
    },
    "-LSp33lP1b5W2XOXyEmI" : {
      "author" : "Stephen King",
      "rating" : "10",
      "title" : "\"Cujo\""
    }
}

每个键是由Firebase在调用push方法时以编程方式生成的。 现在,我想验证用户的输入,但是密钥似乎引起了问题。我在报表中应如何提及?还是有完全不同的原因导致我的规则不起作用?如果我忽略生成的密钥并直接在“ books”对象中引用作者/标题/评分,则可以添加不符合我所述条件的数据。

{
  "rules": {
    ".read": "true",
    ".write": "true",
      "books" : {
        "???" : {
          "author" : {
            ".validate" : "newData.isString() && newData.val() > 0"
          },
          "title" : {
            ".validate" : "newData.isString() && newData.val() > 0"
          },
          "rating" : {
            ".validate" : "newData.isNumber()"
          }
        }
      }
  }
}

如果有任何提示,我将不胜感激。

Link to the repo of my project

2 个答案:

答案 0 :(得分:0)

您首先应该去规则模拟器测试您的规则,它位于规则的右侧。

在模拟类型中,选择SET。

在区域中,将/ books / {newkey}写入JSON区域:

{ “作者”:“作者数据” }

对于newkey(您的推式生成键)节点下的每个字段重复此操作。

这至少会告诉您哪些规则不起作用,如果您单击详细信息,您将能够知道原因。

我还要补充一点,您如何得出类似于author:“ stephen的数据,我的意思是没有最后一个引号?

答案 1 :(得分:0)

您应将Firebase按键称为例如“ $ bookId”,然后可以根据需要在规则中使用它。

示例:

{
  "rules": {
    "rooms": {
      // this rule applies to any child of /rooms/, the key for each room id
      // is stored inside $room_id variable for reference
      "$room_id": {
        "topic": {
          // the room's topic can be changed if the room id has "public" in it
          ".write": "$room_id.contains('public')"
        }
      }
    }
  }
}

https://firebase.google.com/docs/database/security/securing-data#using_variables_to_capture_path_segments