您可以控制Firebase实时数据库安全规则中的各个属性吗?

时间:2019-05-02 15:53:07

标签: firebase firebase-realtime-database firebase-authentication firebase-security firebase-security-rules

我需要控制对Firebase rtdb的users目录中某个用户对象下各个属性的访问。我当前的规则如下:

{
  "rules": {
    "users": {
      "$uid": {
        "name": {
          ".write": "auth.uid === 'adminID' || $uid === auth.uid",
            ".read": "auth.uid === 'adminID' || $uid === auth.uid"
        },
        "plans": {
          ".write": "auth.uid === 'adminID' || $uid === auth.uid",
            ".read": "auth.uid === 'adminID' || $uid === auth.uid"
        },
        "survey": {
          ".write": "auth.uid === 'adminID' || $uid === auth.uid",
            ".read": "auth.uid === 'adminID' || $uid === auth.uid"
        },
        "survey_done": {
          ".write": "auth.uid === 'adminID' || $uid === auth.uid",
            ".read": "auth.uid === 'adminID' || $uid === auth.uid"
        },
        "notes": {
          ".write": "auth.uid === 'adminID'",
            ".read": "auth.uid === 'adminID'"
        },
        "status": {
          ".write": "auth.uid === 'adminID'",
            ".read": "auth.uid === 'adminID'"
        }
      }
    },
    "sending": {
      ".write": "auth.uid === 'adminID'",
      ".read": "auth.uid === 'adminID'"
    }
  }
}

管理员应该能够访问所有数据,但是当我以他的身份登录我的Web应用程序时,出现了一个Permission_denied错误。

此外,用户(非管理员)应该能够看到其name, plans, survey and survey_done属性,但其他任何不受管理员保护的属性都可以。当用户向users/their-user-id发出读取请求时,我得到与上述相同的错误。理想情况下,它将只返回用户确实有权访问的所有属性,但是用户访问这些属性的唯一方法是分别读取对其的请求。

我正在使用的查询是: firebase.database().ref("users").child(id).once("value")

1 个答案:

答案 0 :(得分:1)

当您查询数据库中特定节点的内容时,具有安全规则的安全规则要么允许访问该节点及其所有子节点的整个内容,要么拒绝所有访问。您不能使用安全规则从视图中过滤掉某些子级。

通常,人们的工作是将节点分成两个孩子,并根据用户所需的角色保护每个孩子分开。因此,在您的情况下,将有一个包含名称,计划,测量和Survey_done的节点。然后将有另一个节点用于记录笔记和状态。每个容器节点将具有不同的权限。