首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Firestore安全规则拆分联接方法未按预期工作

Firestore安全规则拆分联接方法未按预期工作
EN

Stack Overflow用户
提问于 2019-03-05 08:30:18
回答 2查看 502关注 0票数 0

我面对两个问题:

  • 您不能更改句点‘’'firebase规则‘中的字符当您使用类似'request.auth.token.email’的东西时(不支持非常有限的操作字符串和联接、替换函数的选项)
  • 如果使用哈希表,您不能在查询中使用电子邮件,因为与‘键’的句号字符相同。

由于上面的问题,我放弃了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“

”;

我的疑问如下:

代码语言:javascript
复制
db.collection("Sites")
        .whereEqualTo("sharedWith.bb@gmail,com","true")

我的文档包含以下内容:

代码语言:javascript
复制
sharedWith
     mm@gmail,com : "true"
     bb@gmail,com : "true"

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

上面的设置不起作用。我收到权限被拒绝的错误。我不知道我做错了什么,请帮帮忙。

EN

回答 2

Stack Overflow用户

发布于 2019-03-05 08:44:24

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

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

代码语言:javascript
复制
resource.data.sharedWith[request.auth.token.email.split('.').join(',')];

如果修改后的字符串存在且为true,则该表达式的计算结果应为true。

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

票数 0
EN

Stack Overflow用户

发布于 2020-03-10 03:30:29

split接受正则表达式作为参数,因此.将匹配任何字符。

除了解决这个问题之外,你还可以用字符串的replace函数来替换它:

代码语言:javascript
复制
allow read: if isSignedIn() && resource.data.sharedWith[(request.auth.token.email).replace('\\.', ',')] in ["true"];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54993682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档