如何设置firebase读取规则并读取所有兄弟节点

时间:2017-07-09 11:49:10

标签: android firebase firebase-realtime-database firebase-security rule

我已将firebase规则设置如下:

    {
  "rules": {"users": {
       "$uid": {
         ".read": "auth != null",
        ".write": "$uid === auth.uid"

    }}
  }
}

允许只写入具有匹配uid的节点并读取每个uid的所有子节点。但我希望它就像我在uid下使用子节点进行查询一样,只有匹配的子节点和它的兄弟节点才能被读取...

例如这是我的json结构:

 {
"users" : {

      "AJkK4yZJsoseeefrJ7i6KIOUBDghtrhgthrtDi1" : {
        "lat" : 20.5001,
        "long" : 68.3755,
        "number" : "9876543210",
        "time" : 1499599788090
      }
    }
}

我想使用数字进行查询,并将读取规则设置为只能读取数字匹配的纬度和时间。如何写规则?

更新:我的问题是,如何使用数字查询数据库并获取其他兄弟姐妹,如果数字的值在android中匹配?我试过这个但没有工作:}

  friend = mDatabase.getReference("users");
  friend.keepSynced(true);


  Query z = LocationActivity.this.friend.orderByChild("number").equalTo("9876054321");

  z.addListenerForSingleValueEvent((new ValueEventListener() {
        long lastseen;
        public void onDataChange(DataSnapshot dataSnapshot) {
            try {
                for (DataSnapshot zoneSnapshot: dataSnapshot.getChildren()) {
                    lastseen = (Long)zoneSnapshot.child("time").getValue();
                    friendLatitude = (Double) zoneSnapshot.child("lat").getValue();
                    friendLongitude = (Double) zoneSnapshot.child("long").getValue();
                }


            } catch (Exception e) {
            }}

它返回值null,任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

为了查询每个节点,用户需要具有父级下 ALL 节点的读取权限。

这是因为安全规则不能用于查询Firebase中的数据。

答案 1 :(得分:1)

附加侦听器时会强制执行Firebase读取权限。为了查询节点,您必须具有该节点的读取权限(如Bradley所述)。因此,为了能够查询用户,您必须具有/users的读取权限。由于任何user that has read permission to /users can also read any data under that,您无法使用安全规则来过滤用户有权访问的节点。

这称为rules are not filters,是Firebase安全模型新手的常见陷阱之一。我建议您阅读我已经链接的文档以及许多questions/answer about the topic中的一些文档。

针对您的用例的最简单的解决方案似乎是将.read规则提升为users

{
  "rules": {
    "users": {
      ".read": "auth != null",
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

}

答案 2 :(得分:0)

不确定是否能回答问题,但是我发现这篇文章正在寻找有关Firebase Storage的以下解决方案..我可以在其中控制可访问哪些同级节点:

  match /uploadRoot/{userId}/{uploadCategory}/{allPaths=**} {

      // allow read access for client upload/download
      allow read, write:
        if request.auth != null
          && request.auth.uid == userId
          && (
              uploadCategory == 'userTextFiles'
              || uploadCategory == 'userImages'
            );