Firebase验证

时间:2014-08-23 10:54:05

标签: firebase firebase-security

我刚开始使用Firebase并进行一些简单的测试。我在验证方面遇到了麻烦。

以下是一些示例代码:

var Firebase = require("firebase");

var myFirebaseRef = new Firebase("https://familytrial.firebaseio.com/");

myFirebaseRef.child("families").on("value", function(snapshot) {
  console.log("Something changed!");
  console.log("%j", snapshot.val());
  console.log("\n\n\n");

}, function(err) {
  console.log("Something failed!");
  console.log(err);
});

setTimeout( function() {

  myFirebaseRef.child('families').push({
    "familyName" : "Jones",
    "members" : {
      "givenName" : "Jim",
      "calledName" : "Koolaid",
      "parent" : true
    }
  }, function(err) {
    if(err) {
      console.log("\nAn error occurred");
      console.log(err);
    }
  })
}, 3000);


setTimeout( function() {

  myFirebaseRef.child('families').push({
    "familyName" : "The Jones Have a Ridiculously Long Family Name That Should Get Rejected",
    "members" : {
      "givenName" : "Jim",
      "calledName" : "Koolaid",
      "parent" : true
    }
  }, function(err) {
    if(err) {
      console.log("\nAn error occurred");
      console.log(err);
    }
  })
}, 3000);

当验证为:

时,此代码可以正常工作
{
  "rules": {
    ".read" : true,
    ".write" : true
  }
}

但是,当我尝试验证家庭中的任何内容时,我会收到权限错误,或者验证似乎不会限制输入。

{
  "rules": {
    ".write": true,
    ".read": true,
    "families": {
      "familyName": {
        ".validate": "newData.isString() && newData.val().length < 50"
      }
    }
  }
}

我希望验证规则允许第一次推送到“家庭”并拒绝第二次。但是,它同时接受推送。

我在验证时做错了什么?

谢谢, 贾斯汀

1 个答案:

答案 0 :(得分:3)

@Kato提到了答案。这是完整的解释。

我正在尝试创建families对象的成员。像这样:

{"familyName":"Jones","members":{"givenName":"Jim","calledName":"Koolaid","parent":true}}

所以,这将创建一个像:

这样的结构
{
  "families": {
    "some_object_id": {
      "familyName": "Jones",
      "members": {
        "givenName": "Jim",
        "calledName": "Koolaid",
        "parent": true
      }
    }
  }
}

但是,我的验证规则是验证familyname对象上的families属性。 那个验证规则对于这样的事情会很有用:

{
  "families": {
    "familyName": "Jones"    
  }
}

这不是我想要的。我的正确验证,需要像这样:

{
  "rules": {
    ".read": false,
    ".write": false,
    "families": {
      ".read": true,
      "$families_id": {
        ".write": "!data.exists() && newData.exists()",
        "familyName": {
          ".validate": "newData.isString() && newData.val().length > 1 && newData.val().length < 50"
        }
      }
    }
  }
}