Firebase - 从端点

时间:2016-10-11 16:31:18

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

TLDR:如何设置数据库访问规则,以便我可以从给定端点读取我有权访问的所有项目?

我的Firebase数据库中有一组类似的数据:

"employees" : [ {
    "first_name" : "Constance",
    "last_name" : "Smith",
    "createdBy: "vdBoGzI2i9f12er6ZcPjG9AiTip2"
  }, {
    "first_name" : "Agatha",
    "last_name" : "Carlton",
    "createdBy: "Tpg1mFR99meDV2QGT44pU6y7s1T2"
  },
  ...
}

我还有一个应用程序用户列表:

  "users" : {
    "Tpg1mFR99meDV2QGT44pU6y7s1T2" : {
      "name" : "Alex Lund",
      "isAdmin": true
    },
    "vdBoGzI2i9f12er6ZcPjG9AiTip2" : {
      "name" : "David Peterson",
      "isAdmin": false
    },
    ...
  },

基本用户只能访问他们创建的员工;管理员将能够阅读所有内容。

{
  "rules": {
    ".write": "auth != null",
    "employees": {
      "$employee": {
        ".read": "root.child('users').child(auth.uid).child('isAdmin').val() === true || data.child('createdBy').val() === auth.uid" 
      }
    },
}

根据此规则,管理员可以阅读ref.child('/employees/0'),但无法访问ref.child('employees')

如何让我读过的所有员工都能访问?运行查询是唯一的解决方案吗?

1 个答案:

答案 0 :(得分:0)

根据您现在拥有的规则,对/users的查询无效。由于您没有/employees的阅读权限,因此该位置的任何听众都会立即被拒绝。

您可能希望规则如下:

{
  "rules": {
    ".write": "auth != null",
    "employees": {
      ".read": "root.child('users').child(auth.uid).child('isAdmin').val() === true"
      "$employee": {
        ".read": "data.child('createdBy').val() === auth.uid" 
      }
    },
}

使用这些规则,管理员可以阅读(并因此查询)/users,而普通用户只能访问他们创建的子项。

这是Firebase数据库安全规则的常见缺陷,通常称为"规则不是过滤器"。请参阅相关的section in the documentation,此original Q&A on it和任何questions in this list