【问题标题】:Firebase Rules - Allow Writing to a Certain Path in Realtime DatabaseFirebase 规则 - 允许写入实时数据库中的某个路径
【发布时间】:2020-07-03 11:18:24
【问题描述】:

我依靠实时数据库从这个结构中为我的应用获取数据:

每个A 有3 个B

在这些规则下阅读工作正常:

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

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

1.授予用户独占写入每个A中的路径/../B3/的权限。

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

所以,我做了一些研究,想出了这套规则:

{

  "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 控制台上使用 Playground 模拟器测试了这些规则,并得到了正确的结果。但是当我尝试在我的测试设备上读取或写入/../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)

我认为我在构建规则时遗漏了一些东西。提前致谢。

【问题讨论】:

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


    【解决方案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
    .
    

    由于您希望用户写入每个 A 子树中的 /../B2 节点,因此应该允许用户访问每个 @ 中的 /../B2 节点987654328@子树

    根据docs/../B3 也不需要 .validate 规则,您不希望用户写入这些规则

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

    最后,/../B2 上需要存在 .validate 语句来检查数字是否为整数。

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

    另外,附带说明一下,设置".write": true 不仅允许您的用户写入数据库,还允许任何人 写入数据库,正如rules docs 指出的那样

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

    因此,如果有丝毫安全问题,请查看规则以确保您已实施措施来强制执行安全。

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

    【讨论】:

    • 对不起,这也不起作用。很抱歉误导您,我的意思是 B3 而不是 B2,我将编辑我的问题。
    • 如果是这种情况,那么对/../B3的写入一定是由于错误的数据类型而失败,数据类型是否为数字?
    • 是的,它是数字,我在你回答后试过了,但它不起作用:(
    • @kh3e 在第一次访问 RTDB 之前尝试启用debug logging 并重复您之前采取的步骤,然后查看日志输出的内容
    • Yash 非常感谢,问题很简单。我发布了答案:)
    【解决方案2】:

    我终于解决了这个问题!呼!

    解决方案:

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

    【讨论】:

      猜你喜欢
      • 2020-06-09
      • 2020-11-22
      • 2019-10-11
      • 2018-01-05
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      相关资源
      最近更新 更多