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

时间:2014-11-13 16:05:53

标签: javascript firebase firebase-security firebasesimplelogin

我正在使用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"

有没有人知道我是如何做到的,所以他们也有能力为他们的“子”对象中列出的用户写入/读取数据(可能只是在属性对象中)?

2 个答案:

答案 0 :(得分:4)

如果您想允许children存储区下列出的用户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)"
        }
      }
    }
  }
}

答案 1 :(得分:3)

这样的事情可以解决问题:

".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 }
            }
        }
}