我遇到Firebase规则问题。基本上我有一个名为'users'的根文件夹,其中包含许多再次包含数据的usersID,完全如下:
users {
userid1 {
info_user {
a: {
a1: whatever
a2: whatever
a3: {
a3.1: whatever
a3.2: whatever
a3.3: whatever
a3.n: whatever
}
}
n: {} ...
}
},
userid2 {}, ...n
}
如果没有安全规则,运行以下代码时一切正常,例如:
{rules {".read" : true, ".write" : true}}
function getUserInfo () {
var dbRef = firebase.database();
var myArray = [];
dbRef.ref('users').on('child_added', function(snapshot) {
snapshot.forEach(function(childSnapshot) {
myArray = (childSnapshot.val().a3);
// do something
});
});
}
我的挑战是在不更改数据库结构的情况下更改安全规则。
所以,我尝试做这样的事情:
{
"rules" : {
".read" : false,
".write" : false,
"users": {
"$userid": {
"info_user": {
"a":{
".read": "auth != null",
".write": "(root.child('r').child('w').hasChild(auth.uid))",
"a1":{".validate": "newData.isString()"},
"a2":{".validate": "newData.isString()"},
"a3":{".validate": "newData.isString()"}
},
"n": {
".read": "auth != null",
".write": "$user_id === auth.uid"
}
}
}
}
}
}
预期结果是在用户通过身份验证时读取节点 a3 。
怎么做?
答案 0 :(得分:2)
首次附加侦听器时,会强制执行Firebase数据库读取权限。因此,当您将监听器附加到dbRef.ref('users')
时,您必须具有/users
的读取权限。在您的安全规则中并非如此。
要使规则有效,请将读取权限移至`users:
{
"rules" : {
"users": {
".read" : "auth != null",
...
请注意,权限级联下来。因此,一旦您授予用户/users
的读取权限,他们就可以访问/users
下的所有数据。您不能将此权限取消用于此处的特定节点。
这会导致保护Firebase数据库的一个缺陷:规则不能用于过滤数据。有关详情,请参阅Firebase documentation on "rules are not filters",此answer about it以及更多questions from developers struggling with the concept。