【问题标题】:User and group permissions in firebase security rulesFirebase 安全规则中的用户和组权限
【发布时间】:2018-10-17 05:10:13
【问题描述】:

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

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

{
  "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 真正解决它。

请注意,我对数据库结构的更改持开放态度。我很好奇如何在一般情况下处理这个问题而无需大量重复数据(例如将所有用户从组保存到组 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"
  }
},

感谢您的帮助。

【问题讨论】:

  • 我认为实际上不可能检查具有当前结构的组成员的权限。所以解决办法是改变结构。我想到了两个选项:让所有组成员拥有权限或让所有组成员拥有数据(如所有者)。这两种选择都带来了维护权限的挑战(例如,用户离开了一个组)
  • 是的,我也考虑过这一点,但我确实想避免仅仅因为某人被添加/离开组而维护 N 个权限节点。所以我很好奇是否有更好的解决方案。如果没有,我想我将不得不走这条路并继续维护很多节点。

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


【解决方案1】:

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

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

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

然后我有类似结构的权限节点,但我在这里放了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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 2016-11-23
    • 2017-01-17
    • 1970-01-01
    • 2020-09-11
    • 2016-07-16
    • 1970-01-01
    相关资源
    最近更新 更多