firebase实时数据库查询数据仅适用于登录用户

时间:2018-08-13 16:57:33

标签: javascript firebase firebase-realtime-database angularfire2 firebase-security-rules

我有以下安全规则:

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

我的数据如下:

    {
    "users" : {
    "JIZW3KswDDMggo9U1WwCoIamHaU2" : {
      "-L8s34CZsCgodNxgF09G" : {
        "email" : "lmn@yahoo.co.in",
        "isAdmin" : true,
        "name" : "Mannu Sharma",
      },
"UKtLdQzPdWa2KJ10iXrjuV80JSd2" : {
      "-L8LTf95dxqQdjYHhFDB" : {
        "email" : "pqr@gmail.com",
        "name" : "Neeti Singhal"
      }
    },
    "YQCXFjnU8jaXR9xUXIgknp18Z3A3" : {
      "-L8TQTFiGLEuxCTbbrQ7" : {
        "email" : "abcd@gmail.com",
        "name" : "John Teslie",

      }
    }
    }

我用来查询数据的angularfire2代码是:

getUserByEmail(email:string){
    console.log("start of getUserByEmail with email:" + email)
    return new Promise((resolve, reject) =>
      {

        this.db.list("/users", 
          ref => ref.orderByChild('email').equalTo(email)
        ).valueChanges().subscribe(
          res => {
            console.log('response:' + JSON.stringify(res))
            resolve(res)
          },
          err => {
            console.log(err)
            reject(err)
          }
        )
      })
  }

我已经登录了实现的Facebook。因此,当我使用电子邮件abcd@gmail.com登录并进行搜索时,它将返回我的记录。但是其他任何搜索均无效。

据我了解,我的安全规则允许任何人查询用户数据。那我想念什么?

1 个答案:

答案 0 :(得分:1)

您的数据是双重嵌套的:您有/users/$uid/$pushId。不需要最后一个级别,这意味着您不能通过其email查询用户。有关此一般情况的更多信息,请参见Firebase Query Double Nested

但是在这种情况下,解决方法非常简单:我认为您不需要JSON中带有推入ID(-L....)的级别。您可能会通过调用push()添加用户数据,而这不是必需的。删除对push()的调用,可能直接使用set(),您应该在JSON树中失去该额外的级别。使用该级别后,您可以通过每个用户的/users属性查询email