我面临两个问题:
由于上述问题,放弃使用HashMap方法,我正在尝试探索Arrays。是否可以通过request.auth.token.email获取登录用户的电子邮件并将其与文档中数组的'email'元素进行比较?
例如-我以'bb@gmail.com'作为登录用户,我想获取'sharedWith'数组包含'bb@gmail.com'作为条目的所有文档,而忽略其余的文件。我可以在代码中实现它,但我也想将这种安排设置为“安全规则”,以使阅读文档更加健壮。
---------更新----------- 我尝试了拆分,并加入了我的安全规则,如下所示: (参考: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"
用户以“ bb@gmail.com”身份登录
以上设置无效。我收到权限被拒绝的错误。 我不知道我在做什么错,请帮忙。
答案 0 :(得分:0)
您的文档结构看起来像地图,但是您将其视为数组。你不能那样做。您只能对数组类型字段执行数组操作。如果您有一个对象类型字段,则数组操作将失败,并且您的规则将立即拒绝访问。
如果要检查对象字段的属性是否为true(应该使用布尔值而不是字符串),然后检查该对象是否存在。 Firestore中的对象类型字段是Map,对象是规则,您可以使用方括号获取该属性的值。
resource.data.sharedWith[request.auth.token.email.split('.').join(',')];
如果存在修改后的字符串,则该表达式的计算结果应为true。
同样,不要使用字符串值“ true”,该字符串值与更合适的布尔值true
不同。
答案 1 :(得分:0)
keybd_event
使用正则表达式作为参数,因此split
实际上可以匹配任何字符。
除了修复之外,您还可以使用替换功能替换字符串:
.