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身份验证规则
- CSS媒体查询(最大高度)不起作用,但为什么? 2022-01-01
- 使用RSelum从网站(报纸档案)中抓取多个网页 2022-09-06
- addEventListener 在 IE 11 中不起作用 2022-01-01
- Flexslider 箭头未正确显示 2022-01-01
- Quasar 2+Apollo:错误:找不到ID为默认的Apollo客户端。如果您在组件设置之外,请使用ProvideApolloClient() 2022-01-01
- Fetch API 如何获取响应体? 2022-01-01
- 如何使用 JSON 格式的 jQuery AJAX 从 .cfm 页面输出查 2022-01-01
- Css:将嵌套元素定位在父元素边界之外一点 2022-09-07
- 失败的 Canvas 360 jquery 插件 2022-01-01
- 400或500级别的HTTP响应 2022-01-01