Javascript 在/项上获取权限被拒绝:客户端没有访问所需数据的权限

Javascript 在/项上获取权限被拒绝:客户端没有访问所需数据的权限,javascript,firebase,firebase-realtime-database,firebase-security,Javascript,Firebase,Firebase Realtime Database,Firebase Security,我正在定义一个firebase规则以通过用户ID读取数据。userId是用户创建的每个数据上的一个标志,当然也就是用户uid 她的规则如下: { "rules": { "items": { "$itemId": { ".read": "auth !== null && root.child('items/$itemId/userId').val() === auth.uid" } } } }

我正在定义一个firebase规则以通过用户ID读取数据。userId是用户创建的每个数据上的一个标志,当然也就是用户uid

她的规则如下:

{
    "rules": {
      "items": {
        "$itemId": {
         ".read": "auth !== null && root.child('items/$itemId/userId').val() === auth.uid"
        }
      }
    }
}
我在客户端访问数据,就像这样:

firebase.database().ref(`/items`)
    .once('value')
    .then(snapshot => {
      const places = []
      const data = snapshot.val();
      for (let key in data) {
        places.push({
          ...data[key],
          key: key
        });
      }
    })
我希望根据每个项目的userId标志对所有者进行数据访问


下面的数据结构示例:

根据Firebase文档。然而,去年引入了2018查询规则,我认为在理解这一点上,前者优于后者

因此,要保持当前的数据结构,您的规则应更改为:

{
    "rules": {
      "items": {
         ".read": "query.orderByChild == 'userId' && query.equalTo == auth.uid"
      }
    }
}
然后,您还必须更改查询:

firebase.database().ref(`/items`).orderByChild('userId').equalsTo(userId)...
最后一件事,您的数据库结构可能指向其他需求:

如果您想让您的数据只供创建它的用户访问,并且有一个可以查看所有内容的管理员,那么更好的解决方案是对您的数据进行非规范化。您的数据结构将是: 这里的管理问题是通过管理节点解决的,它可以与和一起使用

因为有一个places(地点)这个词,也许你需要用其他类似的词来表示地点
谢谢你的留言,很有帮助。我添加了具有以下规则的管理树:root.child'admins.childauth.uid.child'isAdmin.val==true,在客户端:iffirebase.database.ref'/admins.orderByChildcurrentUser.uid.equalTotrue返回管理员的所有数据,但不返回数据。对于如何将客户端的数据过滤器与提供的规则匹配,有何建议?
user_items: {
    uid1: {
          key1:{//full object here}
     }
},
items: {
    key1:{//partial item here, just name and photo, think on a list}
},
admins:{
    uid1:true
}