Javascript 基于数据对象的Firebase用户写/读规则

Javascript 基于数据对象的Firebase用户写/读规则,javascript,firebase,firebase-security,firebasesimplelogin,Javascript,Firebase,Firebase Security,Firebasesimplelogin,我使用的是firebase,我的用户设置如下: { "firebase-account-123": { "users": { "simplelogin:1": { "properties"{ "name": "john doe", "email": "user@email.com" } "children": { "simplelogin:2":

我使用的是firebase,我的用户设置如下:

{
    "firebase-account-123": {
        "users": {
            "simplelogin:1": {
                "properties"{ "name": "john doe", "email": "user@email.com" }
                "children": {
                    "simplelogin:2":{ "name": "user 2", "email": "user2@email.com" },
                }
            },
            "simplelogin:2": {
                "properties"{ "name": "user 2", "email": "user2@email.com", "disabled": false }
            }
        }
}
我有“孩子”,客户经理应该可以接触到这些孩子。我是新手,我正在尝试解决一些权限问题

我的规则目前只允许用户读取/写入自己的数据

”.read:“auth.uid==$userid”,“.write:“auth.uid==$userid”


是否有人知道我如何做到这一点,以便他们也能够为“子对象”中列出的用户写入/读取数据(可能仅在properties对象中)?

类似的操作应该可以做到:

".read": "auth.uid == $userid || root.child('users/'+auth.uid+'/children/'+$userid).exists()"
因此,在以下情况下,这将授予对节点的访问权限:

  • 它是当前登录用户自己的节点
  • 当前登录的用户有一个具有节点id的子节点
我建议稍微清理一下您的数据结构,以删除子系统中的重复数据:

{
    "firebase-account-123": {
        "users": {
            "simplelogin:1": {
                "properties"{ "name": "john doe", "email": "user@email.com" }
                "children": {
                    "simplelogin:2": true
                }
            },
            "simplelogin:2": {
                "properties"{ "name": "user 2", "email": "user2@email.com", "disabled": false }
            }
        }
}

如果您想允许
子对象
存储桶下列出的用户ID也读写数据,请尝试在安全规则中使用
hasChild()
方法

例如,使用与上述相同的数据结构:

{
  "rules": {
    ".read": false,
    ".write": false,
    "users": {
      "$userid": {
        ".read": "auth.uid == $userid",
        ".write": "auth.uid == $userid",
        "properties": {
          ".read": "root.child('users').child(auth.uid).child('children').hasChild($userid)"
        }
      }
    }
  }
}

美好的我不知道hasChild
,所以总是以
存在
结束。谢谢Rob的帮助!你肯定为我把事情看得很清楚。谢谢你,这很有道理,我很感激。好的。Rob的解决方案非常相似;他还检查子节点是否存在。最大的区别是,他只允许经理读取孩子的属性,因此限制性更强。根据我所看到的常见用法,这种结构很可能无法很好地扩展。您可能想考虑将“孩子”移动到单独的路径,因为它很可能是一个单独的逻辑组件(即我管理的人的列表)。如果安全规则和迭代数据位于各自的路径中,那么它们可能会简单得多。