Javascript Firebase实时数据库规则在前端不起作用

Javascript Firebase实时数据库规则在前端不起作用,javascript,firebase,firebase-realtime-database,firebase-security,Javascript,Firebase,Firebase Realtime Database,Firebase Security,特定TLDR:rule”.read:“auth!=null&&data.child('userEmail').val()==root.child('users').child(auth.uid.).child('email').val()”应能在应用程序中正常工作 我遵循了文档和规则,测试工作正常,所以我认为这与我的认证方式有关,也许?我将提供以下信息,希望有人能尽快回答这个问题 实时数据库结构: "db-name": { "units": {

特定TLDR:rule
”.read:“auth!=null&&data.child('userEmail').val()==root.child('users').child(auth.uid.).child('email').val()”
应能在应用程序中正常工作

我遵循了文档和规则,测试工作正常,所以我认为这与我的认证方式有关,也许?我将提供以下信息,希望有人能尽快回答这个问题

实时数据库结构:

"db-name": {
  "units": {
    0: {
      "serial": "002",
      "userEmail": "s@gmail.com"
    },
    1: {
      "serial": "001",
      "userEmail": "r@gmail.com"
    }
  },
  "users": {
    "R6nlZ...": {
      "email": "r@gmail.com"
    },
    "qwerty...": {
      "email": "s@gmail.com"
    }
  }
}
规则对象:

{
  "rules": {
    // ".read": "now < 1604037600000",  // 2020-10-30
    // ".write": "now < 1604037600000",  // 2020-10-30
    "units": {
      ".indexOn": "userEmail",
      "$key": {
        ".read": "auth != null && data.child('userEmail').val() === root.child('users').child(auth.uid).child('email').val()",
        ".write" : "auth != null && data.child('userEmail').val() === root.child('users').child(auth.uid).child('email').val()"
      }
    },
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}
当我将Firebase权限设置为我粘贴的规则中的上述权限时,用户
r@gmail.com
看不到任何单位。如果我让读取权限完全打开(不是我想要的),则该用户可以看到他们的单元

对我来说,这毫无意义,因为我认为无论用户使用何种登录类型,Firebase在用户登录时都可以看到
auth.uid

"$key": {
        ".read":   "auth !== null && root.child('users').hasChild(auth.uid)",
        ".write" : "auth !== null && root.child('users').hasChild(auth.uid)"
}
这样写的话,用户集合中存在的任何用户都可以访问“单位”


或者,您可以使用该用户的uid进行收集,并将密钥与其访问的uid进行匹配

您的规则不允许此查询:

firebase.database().ref().child('units').orderByChild('userEmail').equalTo(firebase.auth().currentUser.email);
要使此查询起作用,用户需要对
/units
具有读取权限。由于您没有声明任何
.read
关于
/units
的规则,因此查询被拒绝

您似乎认为规则会过滤数据,只返回用户应该有权访问的数据,但这不是它们的工作方式。正如Firebase文档所述:

但是,为了安全地允许查询数据

在您的场景中,这看起来像:

{
  "rules": {
    "units": {
      ".read": "auth.uid != null &&
                query.orderByChild == 'userEmail' &&
                query.equalTo == auth.token.email"
      ...
现在您的查询将被允许,而对
/users
的其他/更广泛的读取将被拒绝

{
  "rules": {
    "units": {
      ".read": "auth.uid != null &&
                query.orderByChild == 'userEmail' &&
                query.equalTo == auth.token.email"
      ...