Firestore安全规则拆分连接方法无法按预期工作

问题描述 投票:0回答:1

我面临两个问题:

  • 你无法改变时期'。'使用“request.auth.token.email”之类的“firebase rules”中的字符(操作字符串和连接的选项非常有限,不支持替换函数)
  • 如果使用hashmap,则不能在查询中使用电子邮件,因为与“密钥”具有相同的句点字符。

由于上述问题放弃了HashMap方法,我正在尝试探索数组。有没有办法通过request.auth.token.email获取登录用户的电子邮件,并将其与文档中数组的“email”元素进行比较?

例如 - 我有'[email protected]'作为登录用户,我想获取'sharedWith'数组包含'[email protected]'作为条目的所有文档,并忽略其余文档。我可以在代码中实现它,但我想将此安排设置为“安全规则”,以使阅读文档更加健壮。

---------更新-----------我尝试拆分并加入我的安全规则如下:(ref:Using the replace function in firestore security rules

  allow read: if isSignedIn() && resource.data.sharedWith[(request.auth.token.email).split('.').join(',')] in ["true"];

我的查询如下:

db.collection("Sites")
        .whereEqualTo("sharedWith.bb@gmail,com","true")

我的文件如下:

sharedWith
     mm@gmail,com : "true"
     bb@gmail,com : "true"

用户以'[email protected]'身份登录

以上设置无效。我得到许可被拒绝错误。我不知道我做错了什么,请帮忙。

firebase google-cloud-firestore firebase-security-rules
1个回答
0
投票

您的文档结构看起来像一个地图,但您将其视为一个数组。你不能这样做。您只能对数组类型字段执行数组操作。如果您有对象类型字段,则阵列操作将失败,并且您的规则将立即拒绝访问。

如果要检查是否存在值为true的对象字段的属性(并且您应该使用布尔值,而不是字符串),则检查该对象是否存在。 Firestore中的对象类型字段是Map对象是规则,您可以使用方括号获取该属性的值。

resource.data.sharedWith[request.auth.token.email.split('.').join(',')];

如果修改后的字符串存在且为真,则该表达式应评估为true。

同样,不要使用字符串值“true”,这与更合适的布尔值true不同。

© www.soinside.com 2019 - 2024. All rights reserved.