firebase安全规则中的用户和组权限

时间:2018-05-07 11:46:00

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

我有一个应用程序,我有数据对象,这些对象可以由单个用户或用户组读/写。我试图弄清楚为这种逻辑编写安全规则的最佳方法是什么,以及构建我的实时数据库的最佳方法。

我试图寻找解决方案,但我从未找到过我的确切用例。这是我的数据库的例子:

{
  "data": {
    "data1": {
      "id": "data1",
      "name": "Some data",
      "content": "Some content...",
      "visibility": "private",
      "owner": "user1"
    },
    "data2": ...
  },

  "dataPermissions": {
    "data1": {
      "user1": "read",
      "user2": "write",
      "group1": "write"
    },
    "data2": {...}
  },

  "groupMembers": {
    "group1": {
      "user3": true,
      "user4": true
    }
  },

  "userGroups": {
    "user4": {
      "group1": true
    }
    ...
  }
}

我的问题是如何设置安全规则来检查用户是否可以读/写数据节点?我知道如何检查单个用户。但我无法弄清楚如何检查该组。如何检查安全规则,例如。 user4可以读/写data1节点吗?由于每个用户可以有多个组,每个数据节点有几个组,因此我无法使用动态变量$uid真正解决它。

请注意,我对数据库结构的变化持开放态度。我更好奇如何处理这个问题一般没有太多重复数据(比如将组中的所有用户保存到group id节点下的dataPermissions),以保持数据库维护的正常。

以下是我在安全规则中检查用户权限的方法:

"data": {
  "$dataId": {
    ".read": "data.child('owner').val() == auth.uid || data.child('visibility').val() == 'public' || root.child('dataPermissions/' + $dataId + '/' + auth.uid).exists()",
    ".write": "false"
  }
},

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

好的,我已经解决了这个问题,虽然这有点复杂。但我无法想象一个更好的。我以这种形式存储对给定数据对象具有访问权限的所有用户和组:

dataUsers
|_ data-1
   |_ user-1: 1
   |_ user-2: 3
   |_ group-1: 1

Number描述了用户可以对数据执行的操作(读/写等)。

然后我拥有具有相似结构的权限节点,但不是组I,而是将uid组成员放在此处。这样,我可以针对安全规则中的给定数据对象定位每个用户。并且由于一个用户可以拥有多个给定对象的访问权限源(他可能是数据的所有者+可以是具有不同数据访问权限的几个组的成员),因此我会跟踪给定用户的所有不同AR源以及每次更新都会重新计算生成的AR,以便给定用户从其所有AR来源中获取最高数字。

permissions
|_ data-1
   |_ user-1:
      |_ data-1: 1
      |_ group-1: 1
   |_ user-2:
      |_ data-1: 3
      |_ group-2: 2
   |_ user-3:
      |_ group-1: 1
相关问题