Firebase规则-允许写入实时数据库中的特定路径

时间:2020-07-03 11:18:24

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

我依靠实时数据库从此结构获取应用程序的数据:

Data structure

每个A都有3个B

在以下规则下,阅读效果良好:

{
    "rules": {
        ".read": true,
        ".write": false
    }
}

现在,我处于测试模式,我想实现两项

1。。授予用户权限,将唯一性写入每个/../B3/中的路径A

2。。用户在/../B3/中输入的值必须是数字(最好是Integer)。

因此,我进行了一些研究并提出了以下规则:

{

  "rules": {
    "A1":{
          "B1":{
            ".read": true,
            ".write": false
           },
          "B2":{
            ".read": true,
            ".write": false
           },
        "B3":{
          ".read": true,
          ".write": true,
            ".validate": "newData.isNumber() && newData.val() % 1 === 0.0"
         }
   },
    "A2":{
          "B1":{
            ".read": true,
            ".write": false
           },
          "B2":{
            ".read": true,
            ".write": false
           },
        "B3":{
          ".read": true,
          ".write": true,
            ".validate": "newData.isNumber() && newData.val() % 1 === 0.0"
         }
   },
    "A3":{
          "B1":{
            ".read": true,
            ".write": false
           },
          "B2":{
            ".read": true,
            ".write": false
           },
        "B3":{
          ".read": true,
          ".write": true,
            ".validate": "newData.isNumber() && newData.val() % 1 === 0.0"
         }
   }
}

问题:

我在Firebase控制台上使用游乐场模拟器测试了这些规则,并获得了正确的结果。但是,当我尝试在测试设备上对/../B3/进行读取或写入操作时,此操作无效。相反,我在LogCat中得到了此异常:

com.google.firebase.database.DatabaseException: Firebase Database error: Permission denied
    at com.google.firebase.database.DatabaseError.toException(com.google.firebase:firebase-database@@16.0.4:229)
    at com.app.activity$3.onCancelled(activity.java:567)

我认为我在构造规则方面缺少一些东西。预先感谢。

2 个答案:

答案 0 :(得分:1)

据我所知,规则的结构必须为

{

  "rules": {
    "A1":{
          "B1":{
            ".read": true,
            ".write": false
           },
          "B2":{
            ".read": true,
            ".write": true //changed
            ".validate": "newData.isNumber() && newData.val() % 1 === 0.0" //added
           },
        "B3":{
          ".read": true,
          ".write": false, //changed
         }
   }
.
. //rest of the rules in the same pattern
.

因为您希望用户唯一地写到每个/../B2子树中的A节点,所以应该允许他们访问{{1 }}节点在每个/../B2子树中

根据{{​​3}}

也不需要A上的 .validate 规则,您不希望用户写这些规则。

.validate
.write规则授予访问权限后使用,以确保所写入的数据符合特定的架构。

最后,/../B3上必须存在一个 .validate 语句,以检查数字是否为整数。

至于异常,很明显出现了/../B2错误,因为 .write 已在Permission Denied中设置为false

另外,请注意,设置/../B2不仅允许您的用户写入数据库,还允许任何人以{{3} }指出

在开发过程中,可以使用公共规则代替默认规则来将文件设置为公共可读和可写。这对于原型制作很有用,因为您无需设置身份验证即可开始使用。这种访问级别意味着任何人都可以读取或写入您的数据库。您应该在启动应用之前配置更安全的规则。

因此,如果丝毫没有安全性的问题,请查看规则,以确保您已采取措施实施安全性。

最后,希望这能回答您的问题

答案 1 :(得分:0)

我终于解决了这个! ew!

解决方案:

{

  "rules": {
".read": true, //The difference
    "A1":{
        "B3":{
          ".write": true,
            ".validate": "newData.isNumber() && newData.val() % 1 === 0.0"
         }
   },
    "A2":{
        "B3":{
          ".write": true,
            ".validate": "newData.isNumber() && newData.val() % 1 === 0.0"
         }
   },
    "A3":{
        "B3":{
          ".write": true,
            ".validate": "newData.isNumber() && newData.val() % 1 === 0.0"
         }
   }
}

说明:

我缺少读取根节点的权限,并且根据级联原理,如果您无法访问其父节点(即使每个孩子都使用".read": true,也无法访问其子节点)。 (逻辑!)

找到它的地方:一段43分钟的视频The key to Firebase security - Google I/O 2016:P