【发布时间】: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