带有共享数据的Firebase实时数据库规则组

eeq64g8w  于 2023-02-19  发布在  其他
关注(0)|答案(1)|浏览(134)

我需要创建一个有许多组的系统。

  • 该组可以有多个用户。
  • 用户可以属于多个组。
  • 用户可以具有不同的权限:读取其他成员数据、写入其他成员数据、更改其他成员权限
  • 所有成员只有在具有读取其他数据权限(组/$group_id/成员/uid/canReadOthersData = true)的情况下,才能读取组成员的数据。
  • 每个用户都已经将自己的数据存储在UserData路径中

我编写了以下规则,但问题是我无法给予Group成员权限以读取其他用户带有或结尾部分的数据:
根目录.子目录(“组”).子目录($group_id).子目录(“成员”).有子目录(auth.uid)
仅仅是因为它不能与$group_id一起工作。
我没有找到任何函数可以给予我检查UserData组中的组内是否有uid。我的约束是我已经有了UserData部分,并且我不能更改它,因为它已经被填充,但是我需要围绕它定义一个Group部分。我应该以其他方式构建它吗?比如为每个用户定义一个其他路径,它可能在哪个组中?

{
  "rules": {

    "Groups": {
      "$group_id": {

        ".read": "data.child('Members').child(auth.uid).exists()",
        ".write": "data.child(auth.uid).child('canChangeRegistry').val() == true",
        "Members": {
          ".read": "data.child(auth.uid).exists()",
          ".write": "data.child(auth.uid).child('canChangeRegistry').val() == true",
          "$uid": {
            ".read": "data.child(auth.uid).exists()",
            ".write": "auth.uid === $uid || data.child('canChangeRegistry').val() == true"
          }
        }
      }
    },

    "UserData": {
      "$uid": {
        ".read": "auth.uid === $uid || root.child('Groups').child($group_id).child('Members').hasChild(auth.uid)",
        ".write": "auth.uid === $uid "
      }
    },

  }
}
osh3o9ms

osh3o9ms1#

没有办法让规则在所有组中搜索成员资格匹配,因为这无法扩展。
我看到的唯一选项是为每个用户存储一个额外的列表,以及与他们共享组的所有其他用户,然后在向组添加用户和删除用户时更新该列表。
有了这样一个列表,安全规则中的查找就只依赖于auth.uid$uid,因此可能类似于:

root.child('UserBuddies').child(auth.uid).hasChild($uid)

相关问题