这是我数据的结构
{
"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
});
};
答案 0 :(得分:6)
查看数据的结构以及规则,看起来&#34; proj1&#34; /&#34; proj2&#34; /&#34;之间缺少数据级别。 proj3&#34;以及具有name
和status
属性的对象。
具体来说,您配置的.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"
}
}
}
}
}