Firebase:如何阅读父级中的每个子节点,但具有特定数据的子级

时间:2016-07-16 23:18:58

标签: firebase firebase-realtime-database firebase-authentication firebase-security

假设如下。

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'),如下所示。

  • 不使用state = false
  • 发布帖子
  • 优先考虑最喜欢的帖子

安全规则

  • 拒绝发布状态== false的帖子。

这是我如何查询数据的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;

以上是根据我的理解,到目前为止,请纠正我丢失的地方。

1 个答案:

答案 0 :(得分:3)

不幸的是,当用户作为读/写父节点的权限时,不可能阻止任何子节点上的读/写。您可以在Firebase Docs中了解有关安全规则如何级联的更多信息。

也就是说,有几种可能的解决方案供您考虑:

  1. 您可以将其移至单独的父节点,而不是将帖子标记为已删除。然后,您可以调整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": {
          }
        }
      }
    }
    
  2. 保留一个可见的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
      }
    }