yod*_*een 7 firebase firebase-security
我在firebase中有一个记录列表,其中包含一个包含零个或多个组的组属性.我也有firebase auth对象,它也有零个或多个组.我想为我的记录设置.read firebase规则,该规则将检查两者是否至少有两个列表中存在的组.
换句话说,我有一个用户,它有一组已分配给它的组.我有一些记录,其中还有一些组列表,用于指定用户访问它们必须具有的组.如果登录用户尝试访问记录,我想确保用户至少有一个记录所需的组.
在客户端我会做类似的事情 _.intersect(userGroups, recordGroups).length > 0
我不确定如何在firebase规则表达式中执行此操作.如果它像这样工作会很酷.
记录:
{
someData: "test"
groups: ['foo', 'bar']
}
Run Code Online (Sandbox Code Playgroud)
Firebase Auth对象:
{
userName: "Bob",
groups: ['foo', 'bar']
}
Run Code Online (Sandbox Code Playgroud)
规则数据:
{
"rules": {
"records": {
"$recordId": {
".read": "data.child('groups').intersectsWith(auth.groups)"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
更新:
我认为如果hasChildren()使用|| 而不是&&我可以将组名放在关键位置并以这种方式检查它们的存在.就像是"data.child('groups').hasChildren(auth.groups, 'or')"
记录:
{
someData: "test"
groups: {
'foo': '',
'bar': ''
}
}
Run Code Online (Sandbox Code Playgroud)
Update2: 基于加藤的评论和链接,我意识到即使hasChildren可以做OR,它仍然无法正常工作.如果当前用户无权访问每条记录,则对单个记录的请求将起作用,但对所有记录的请求将会出错.
目前尚不清楚如何构建数据来实现这一目标.如果记录可能属于许多组,那该怎么办?这是一个非常常见的场景(基本上linux组权限是如何工作的)所以我不能成为唯一一个尝试这样做的人.任何人都有任何想法/示例如何在firebase中完成此任务?
目前来看,我认为这是不可能的。允许使用的变量、方法和运算符数量有限,如下所示:
由于规则中不允许函数定义,因此您不能做任何花哨的事情,例如在数组上调用 array.some(callback) 来自己进行匹配。
据我所知,你有三个选择:
1)复制数据,这样您就不需要进行检查。这就是我在项目中所做的:我希望一些用户数据(名称)可供在其网络列表中共享网络的用户使用。最初我想检查两个成员的网络列表,看看是否至少有一个匹配。最终我意识到,将每个用户的名称保存为网络数据的一部分会更容易,这样就不必进行需要这种奇怪权限的用户查找。我对您的数据了解不够,无法建议您需要复制哪些内容。
2)使用字符串而不是数组。您可以将一个字符串转换为正则表达式(或仅将其保存为正则表达式格式),并使用它来搜索另一个字符串以查找匹配项。Firebase 数据库正则表达式文档
3)如果您有足够多的像这样的奇怪情况,请实际运行一个以自定义方式验证请求的服务器。在数据库中,只需授予您的服务器权限。您可以使用Firebase Cloud Functions或使用Firebase Admin SDK部署自己的服务器
| 归档时间: |
|
| 查看次数: |
1090 次 |
| 最近记录: |