【问题标题】:Firebase data validation with programmatically generated key created by Firebase使用 Firebase 创建的以编程方式生成的密钥验证 Firebase 数据
【发布时间】:2018-12-03 20:18:24
【问题描述】:

我正在使用 React 和 Firebase 制作一个简单的图书管理器应用。用户可以输入图书的作者、标题和评级,我正在尝试验证输入。

数据结构如下:

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

在调用 push 方法时,Firebase 会以编程方式生成每个键。 现在,我想验证用户的输入,但关键似乎提出了一个问题。我应该如何在陈述中提及它?或者我的规则不起作用的原因可能完全不同?如果我省略生成的键并直接在“书籍”对象中引用作者/标题/评级,我可以添加不符合我所说的条件的数据。

{
  "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

【问题讨论】:

  • 您在问题中包含了规则和 JSON 树的图片。请将这些替换为实际规则和 JSON 作为文本。后者您可以通过单击your Firebase Database console 的溢出菜单 (⠇) 中的 Export JSON 链接轻松获得。将规则和 JSON 作为文本使它们可搜索,使我们能够轻松地使用它们来测试您的实际数据并将其用于我们的答案中,通常只是一件好事。
  • 如果您指出您的规则有哪些不适用的地方也很好。如果它与您尝试过的代码有关,请显示使用这些规则重现问题的最少代码,并说明哪些问题不起作用。
  • 嗨!谢谢你的建议,让我的帖子更清晰。我根据您的建议对其进行了编辑。我希望我所做的更改会有所帮助。
  • 再次:确保所有文本内容都以文本形式出现在帖子中。这里不需要任何屏幕截图。现在,如果我想回答,我必须重新输入你的大部分规则。虽然有些人可能会这样做,但这对他们来说是愚蠢的方便工作,如果您提供所有文本并使用 Stack Overflow 格式化工具使其看起来不错,则可以避免。

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


【解决方案1】:

你应该先去规则模拟器测试你的规则,它在你的规则的右边。

在模拟类型中选择SET。

在区域写 /books/{newkey} 在 JSON 区域写:

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

对 newkey(您的推送生成的密钥)节点下的每个字段重复此操作。

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

另外我想补充一下,你如何得出像作者这样的数据:“斯蒂芬,我的意思是没有最后一个引号?

【讨论】:

    【解决方案2】:

    您应该将您的 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

    【讨论】:

      猜你喜欢
      • 2018-10-05
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 2014-05-28
      • 2017-07-07
      • 1970-01-01
      • 2016-02-07
      相关资源
      最近更新 更多