假设如下。
posts : {
"$postid":{
"meta":{
"state":true,
"text" :"I should be read",
},
"likes":{
"uid1":true,
"uid2":true,
},
},
"$postid":{
"meta":{
"state":false,
"text" :"I should be read",
},
"likes":{
"uid1":true,
"uid2":true,
"uid3":true,
},
}
}
我想查询父节点('posts'),如下所示。
安全规则
这是我如何查询数据的Javascript版本。 ////$.fdr === firebase.database.ref();
$.fdr("posts").orderByChild("time").limitToLast(20).once('value',function(r) {
var r = r.val();
if(r !== null){
///use r;
}
},function(e){
console.log(e);
});
为什么:我希望用户删除帖子,以后可以撤消删除。 要删除我将“post.meta.state”的值更改为“false”。 虽然“post.meta.state”为false,但安全规则不应允许读取该帖子。
问题:如果我在帖子节点而不是父节点(“帖子”)内设置规则,
"postid": {
".read":"data.child('state').val() == true"
}
然后我可以限制“.read”,但前提是我会按如下方式查询帖子:
firebase.database.ref("posts/postid");
否则,如果我尝试从父节点查询,如:
firebase.database.ref("posts/"),
这样我就可以过滤掉我不希望退回的帖子,然后我必须将规则从“帖子”子级提升到“帖子”(父级),这将导致孩子们的规则被忽略,在那里我似乎无法找到一种方法拒绝返回帖子“state”== false;
以上是根据我的理解,到目前为止,请纠正我丢失的地方。
答案 0 :(得分:3)
不幸的是,当用户作为读/写父节点的权限时,不可能阻止任何子节点上的读/写。您可以在Firebase Docs中了解有关安全规则如何级联的更多信息。
也就是说,有几种可能的解决方案供您考虑:
您可以将其移至单独的父节点,而不是将帖子标记为已删除。然后,您可以调整deleted_posts的安全规则以隐藏它。
{
"posts": {
"$postid1": {
"meta": {
"state": true,
"text": "I should be readable"
},
"likes": {
"uid1": true,
"uid2": true,
"uid3": true
}
}
}
"deleted_posts": {
"$postid2": {
"meta": {
"state": false,
"text": "I should not be readable"
},
"likes": {
}
}
}
}
保留一个可见的postid单独列表,并设置"帖子"节点不可读,但如果没有隐藏,则子节点可读。您将不得不进行第二次查询以获取每个帖子的数据:
{
"posts": {
"$postid1": {
"meta": {
"state": true,
"text": "I should be readable"
},
"likes": {
"uid1": true,
"uid2": true,
"uid3": true
}
},
"$postid2": {
"meta": {
"state": false,
"text": "I should not be readable"
},
"likes": {}
},
"$postid3": {
"meta": {
"state": true,
"text": "I should be readable"
},
"likes": {}
}
},
"visible_posts": {
"$postid1": true,
"$postid3": true
}
}