我需要创建一个有许多组的系统。
- 该组可以有多个用户。
- 用户可以属于多个组。
- 用户可以具有不同的权限:读取其他成员数据、写入其他成员数据、更改其他成员权限
- 所有成员只有在具有读取其他数据权限(组/$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 "
}
},
}
}
1条答案
按热度按时间osh3o9ms1#
没有办法让规则在所有组中搜索成员资格匹配,因为这无法扩展。
我看到的唯一选项是为每个用户存储一个额外的列表,以及与他们共享组的所有其他用户,然后在向组添加用户和删除用户时更新该列表。
有了这样一个列表,安全规则中的查找就只依赖于
auth.uid
和$uid
,因此可能类似于: