【问题标题】:Firebase user write/read rules based on data objects基于数据对象的 Firebase 用户写入/读取规则
【发布时间】:2015-01-10 20:28:58
【问题描述】:

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

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

【问题讨论】:

  • 根据我所看到的常见用法,这种结构很可能无法很好地扩展。您可能需要考虑将“孩子”移动到单独的路径,因为它很可能是一个单独的逻辑组件(即我管理的人员列表)。如果安全规则和迭代数据在自己的路径中,它们可能会简单得多。

标签: javascript firebase firebase-security firebasesimplelogin


【解决方案1】:

如果您想让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)"
        }
      }
    }
  }
}

【讨论】:

  • 不错。我不知道hasChild,所以总是以exists结尾。
  • 感谢 Rob 的帮助!您肯定会为我考虑问题。
【解决方案2】:

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

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

【讨论】:

  • 谢谢,这很有意义,我很感激。
  • 好的。 Rob 的解决方案非常相似。他还检查子节点是否存在。最大的不同是他允许manager只读取children的properties,所以限制性更强。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 2021-06-10
  • 1970-01-01
  • 2018-12-29
  • 2020-08-19
  • 1970-01-01
相关资源
最近更新 更多