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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (25)

我面临两个问题:

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

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

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

---------更新-----------我尝试了拆分并加入我的安全规则,如下所示:(参考:在firestore安全规则中使用replace函数

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"

用户以'bb@gmail.com'身份登录

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

提问于
用户回答回答于

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

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

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

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

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

扫码关注云+社区

领取腾讯云代金券