有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

Data structure

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

我觉得我在构建规则方面遗漏了一些东西。提前谢谢


共 (1) 个答案

  1. # 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节点,因此应仅允许用户访问每个A子树中的/../B2节点

    。根据docs,在/../B3上不需要验证规则,您不希望用户写入这些规则

    .validate
    Used once a .write rule has granted access, to ensure that the data being written conforms to a specific schema.

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

    至于例外情况,很明显给出Permission Denied错误是因为。写入已在/../B2中设置为false

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

    During development, you can use the public rules in place of the default rules to set your files publicly readable and writable. This can be useful for prototyping, as you can get started without setting up Authentication. This level of access means anyone can read or write to your database. You should configure more secure rules before launching your app.

    因此,如果安全性是一个微不足道的问题,请查看规则,以确保您已经实施了加强安全性的措施

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