我是Firebase的新手。我正在关注this Tutorial并尝试验证数据,但不知道为什么我的数据没有验证。我想首先检查用户是否存在的作者表,如果存在则可以写入。
模拟结果
Type write
Location /posts/1/1
Data { "Authors": { "1": true } }
Auth { "provider": "google", "uid": "1" }
Admin false
拒绝写入
Line 69 (/posts/1/1)
validate: "root.child('Authors').child(newData.child('Authors').val()).exists()"
我的安全规则是:
"users": {
"$UID": {
".read": "auth.uid == $UID",
".write": "auth.uid == $UID"
}
},
"Authors": {
".read": true,
".write": false
},
"posts": {
".read": true,
"$POSTID": {
".write": "auth.uid != null",
"$UID": {
".validate": "root.child('Authors').child(newData.child('Authors').val()).exists()"
}
}
}
答案 0 :(得分:1)
如果这是写入/posts/1/1
的数据:
{
"Authors": {
"1": true
}
}
验证规则是为表达式newData.child('Authors').val()
提取以下数据:
{
"1": true
}
这是一个对象 - 而不是一个字符串 - 因此传递给root.child('Authors').child(...)
并不是一个明智的价值,这就是验证规则失败的原因。
拥有支持多位作者的结构似乎有点奇怪,但如果这是您真正想要的,那么您可以在层次结构中更深入地添加其他验证规则:
"posts": {
".read": true,
"$POSTID": {
".write": "auth.uid != null",
"$UID": {
".validate": "root.child('users').child($UID).val()).exists()",
"Authors": {
"$AUTHORID": {
".validate": "root.child('Authors').child($AUTHORID).val()).exists()",
}
}
}
}
这些规则将确保/users
的{{1}}条目和$UID
的{{1}}条目。这可能不是你想要的,但是,希望它会使规则本身更清晰。