我有一个应用程序,我有数据对象,这些对象可以由单个用户或用户组读/写。我试图弄清楚为这种逻辑编写安全规则的最佳方法是什么,以及构建我的实时数据库的最佳方法。
我试图寻找解决方案,但我从未找到过我的确切用例。这是我的数据库的例子:
{
"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"
}
},
感谢您的帮助。
答案 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