Firebase:permission_denied - 无法访问newData.child()

时间:2014-12-13 22:59:20

标签: firebase

这是我数据的结构

{
 "projects" : {
     "proj1" : {
           "-JccS4StrTnJdTficR-u" : {
               "name" : "consultation",
               "status" : false
     },
          "-Jd6JlJUfyyZ2U0NTQEs" : {
               "name" : "Words",
               "status" : false
  }
   },
   "proj2" : {
          "-JccS6nwYHRrxvjZtCkt" : {
              "name" : "Rework",
              "status" : false
  },
         "-Jd6Jqa7-EPJuWxbtJAV" : {
             "name" : "Review",
             "status" : false
    }
   },
   "proj3" : {
         "-JccSJ5lEBQEg3XCbG-u" : {
            "name" : "translation",
            "status" : false
     }
    }
   }
 }

这是我的规则

{
"rules": {
  ".read": true,
  "projects": {
      "proj1": {
        ".write": "auth != null"
      },
      "proj2": {
        ".write": true
      },
      "proj3": {
        ".write": true,
        ".validate": "newData.child('name').isString() 
                      && newData.child('name').val().length < 10"
      }
    }
  }
}

创建数据库时,没有规则。现在,我已经制定了规则。我希望名称的长度小于10个字符。

当我运行代码时,我收到以下错误:FIREBASE WARNING: set at /projects/proj3/-Jd4n6XditTHLWKVmhC6 failed: permission_denied

我无法准确地说出它为什么不起作用。我还尝试了这一部分newData.child('name').isString(),但我仍然遇到同样的错误。

以下是将数据推送到FireBase的代码

function saveToFB(taskName, proj) { 
  // this will save data to Firebase
  var project=projTasks.child(proj);
  project.push({
    name: taskName,
    status: false
  });
};

1 个答案:

答案 0 :(得分:6)

查看数据的结构以及规则,看起来&#34; proj1&#34; /&#34; proj2&#34; /&#34;之间缺少数据级别。 proj3&#34;以及具有namestatus属性的对象。

具体来说,您配置的.validate规则是检查&#34; proj3&#34;的name属性的长度,而不是添加到列表中的新元素。

要解决此问题,请尝试增加安全规则定义的深度,并使用$wildcard功能,其中任何带有$前缀的安全规则密钥都被视为带有名称的通配符你可以重复使用。

{
"rules": {
  ".read": true,
  "projects": {
      "proj1": {
        ".write": "auth != null"
      },
      "proj2": {
        ".write": true
      },
      "proj3": {
        ".write": true,
        "$someChildElementHere": {
          ".validate": "newData.child('name').isString() 
                        && newData.child('name').val().length < 10"
        }
      }
    }
  }
}