我面临两个问题:
由于上述问题放弃了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]'身份登录
以上设置无效。我得到许可被拒绝错误。我不知道我做错了什么,请帮忙。
您的文档结构看起来像一个地图,但您将其视为一个数组。你不能这样做。您只能对数组类型字段执行数组操作。如果您有对象类型字段,则阵列操作将失败,并且您的规则将立即拒绝访问。
如果要检查是否存在值为true的对象字段的属性(并且您应该使用布尔值,而不是字符串),则检查该对象是否存在。 Firestore中的对象类型字段是Map对象是规则,您可以使用方括号获取该属性的值。
resource.data.sharedWith[request.auth.token.email.split('.').join(',')];
如果修改后的字符串存在且为真,则该表达式应评估为true。
同样,不要使用字符串值“true”,这与更合适的布尔值true
不同。