如何解决使用数组元素的Firebase身份验证规则
我将Firebase与本机一起使用。在我的应用程序中,我允许用户与以下用户共享内容:与特定用户或全部共享读取,复制或修改权限。 由于Firebase不提供查询的OR功能,因此我使用数组来存储user:permission组合,以便可以使用array-contains-any的任何功能来进行查询
.where("access","array-contains-any",[user_id,`${user_id}:R`,`${user_id}:C`,`${user_id}:M`,"All_R","All_C","All_M"])
这使我可以查询user_id所拥有的所有内容,或者可以与user_id共享,或者具有R,C或M权限也可以与“ All”共享。
现在,我想对身份验证规则进行类似的操作(这样,只有具有“ M”权限的用户才能进行修改等),方法是将经过身份验证的用户ID与数组中的用户ID进行比较。为此,它将需要类似于“ array-contains-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",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
);
使用这些规则,查询将再次成功。
此时,您可以在此处添加其他条件,它应该可以工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。