我面对两个问题:
由于上面的问题,我放弃了HashMap方法,我正在尝试探索数组。有没有办法通过request.auth.token.email获取登录用户的电子邮件,并将其与文档中数组的' email‘元素进行比较?
例如,我有'bb@gmail.com‘作为登录用户,我想要获取'sharedWith’数组包含'bb@gmail.com‘作为条目的所有文档,并忽略其余文档。我可以在代码中实现它,但我希望将这种安排设置为“安全规则”,以使读取文档更可靠。
-更新-我在安全规则中尝试了拆分和连接,如下所示:(参考:Using the replace function in firestore security rules)
true允许读取: if isSignedIn() && resource.data.sharedWith(request.auth.token.email).split('.').join(',') in“
”;
我的疑问如下:
db.collection("Sites")
.whereEqualTo("sharedWith.bb@gmail,com","true")
我的文档包含以下内容:
sharedWith
mm@gmail,com : "true"
bb@gmail,com : "true"
并且用户以'bb@gmail.com‘身份登录
上面的设置不起作用。我收到权限被拒绝的错误。我不知道我做错了什么,请帮帮忙。
发布于 2019-03-05 08:44:24
您的文档结构看起来像一个映射,但您将其视为一个数组。你不能这么做。您只能对数组类型字段执行数组操作。如果您有一个对象类型字段,则数组操作将失败,并且您的规则将立即拒绝访问。
如果要检查对象字段是否有值为true的属性(并且应该使用布尔值,而不是字符串),请检查该对象是否存在。Firestore中的对象类型字段是Map对象,您可以使用方括号获取该属性的值。
resource.data.sharedWith[request.auth.token.email.split('.').join(',')];
如果修改后的字符串存在且为true,则该表达式的计算结果应为true。
同样,不要使用字符串值"true",它与更合适的布尔值true
不同。
发布于 2020-03-10 03:30:29
split
接受正则表达式作为参数,因此.
将匹配任何字符。
除了解决这个问题之外,你还可以用字符串的replace函数来替换它:
allow read: if isSignedIn() && resource.data.sharedWith[(request.auth.token.email).replace('\\.', ',')] in ["true"];
https://stackoverflow.com/questions/54993682
复制相似问题