Firebase authentication rules using array elements(使用数组元素的FireBase身份验证规则)
问题描述
我正在将Firebase与REACT本机一起使用。在我的应用程序中,我允许用户与以下用户共享内容:读取、复制或修改权限,与特定用户或所有用户共享。 由于Firebase不为查询提供OR函数,因此我使用一个数组来存储User:权限组合,这样我就可以使用数组-CONTAINS-ANY功能进行查询,如下所示
.where("access", "array-contains-any", [user_id, `${user_id}:R`, `${user_id}:C`, `${user_id}:M`, "All_R", "All_C", "All_M"])
这使我可以使用R、C或M权限查询由user_id拥有、共享给user_id或共享给";all";的所有内容。
现在,我想对身份验证规则执行类似的操作(以便只有具有权限的用户才能修改等。)通过将经过身份验证的用户ID与阵列中的用户ID进行比较。为此,它将需要类似于身份验证规则的";数组-包含-any";和字符串连接的功能。这可能吗?或者我需要做一些不同的事情吗?
推荐答案
我运行了几个测试,我想我得到了您正在工作的类型的子集。我将逐步完成下面的步骤,这样您就可以在最后构建它。
第一步是使此查询工作:
ref.where("access", "array-contains", user_id)
这很容易通过:
进行保护allow list: if request.auth != null && request.auth.uid in resource.data.access;
因此,如果access
数组中提到了任何人的UID,则任何人都可以阅读文档。
下一步是允许此查询:
ref.where("access", "array-contains-any", [user_id, user_id+":R"]);
当我们针对前面的规则运行此操作时,不允许这样做。这是因为我们正在请求规则不知道的值。
要使其正常工作,请将规则更改为:
allow list: if request.auth != null && (
request.auth.uid in resource.data.access ||
request.auth.uid+":R" in resource.data.access
);
现在代码和规则中的条件再次匹配,并且允许读取。
如果我们为所有访问规则添加另一个条件:
ref.where("access", "array-contains-any", [user_id, user_id+":R", "All_R"]);
然后,使用上面的规则,我们的权限再次被拒绝,因为我们在查询中有规则不知道的值。
要修复它,我们还会在规则中检查该值:
allow list: if request.auth != null && (
request.auth.uid in resource.data.access ||
request.auth.uid+":R" in resource.data.access ||
"All:R" in resource.data.access
);
使用这些规则,查询再次成功。
此时,您可以在此处添加其他条件,它应该可以工作。
这篇关于使用数组元素的FireBase身份验证规则的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用数组元素的FireBase身份验证规则
基础教程推荐
- 动态更新多个选择框 2022-01-01
- 在for循环中使用setTimeout 2022-01-01
- 在 JS 中获取客户端时区(不是 GMT 偏移量) 2022-01-01
- 当用户滚动离开时如何暂停 youtube 嵌入 2022-01-01
- Karma-Jasmine:如何正确监视 Modal? 2022-01-01
- 角度Apollo设置WatchQuery结果为可用变量 2022-01-01
- 我什么时候应该在导入时使用方括号 2022-01-01
- 悬停时滑动输入并停留几秒钟 2022-01-01
- 响应更改 div 大小保持纵横比 2022-01-01
- 有没有办法使用OpenLayers更改OpenStreetMap中某些要素 2022-09-06