【问题标题】:Firestore security rule split join method not working as expectedFirestore 安全规则拆分连接方法未按预期工作
【发布时间】:2019-03-05 00:30:18
【问题描述】:

我面临两个问题:

  • 您不能更改句点 '.'当您使用“request.auth.token.email”之类的内容时,“firebase 规则”中的字符(操作字符串和加入的选项非常有限,不支持替换函数)
  • 如果使用 hashmap,您不能在查询中使用电子邮件,因为与“键”相同的句点字符。

由于上述问题而放弃 HashMap 方法,我正在尝试探索数组。有没有办法通过 request.auth.token.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”身份登录

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

【问题讨论】:

    标签: firebase google-cloud-firestore firebase-security


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我将地图值更改为布尔值,并将查询更改为:.whereEqualTo("sharedWith."+"bb@gmail,com",true)。然后我将我的安全规则更改为 - 允许读取:if isSignedIn() && resource.data.sharedWith[request.auth.token.email.split('.').join(',')];不幸的是,在这些布尔值更改之后没有运气。权限仍然被拒绝@DougStevenson
    • 您是否使用请求模拟器在控制台中测试您的规则?它应该为您提供更多信息。更好的是,使用模拟器来测试具有更多诊断功能的场景。 firebase.google.com/docs/firestore/security/test-rules-emulator
    【解决方案2】:

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

    除了修复,你可以用字符串的替换函数替换它:

    allow read: if isSignedIn() && resource.data.sharedWith[(request.auth.token.email).replace('\\.', ',')] in ["true"];
    

    【讨论】:

      猜你喜欢
      • 2020-10-30
      • 1970-01-01
      • 2018-08-12
      • 2018-04-16
      • 1970-01-01
      • 2019-07-28
      • 2021-12-29
      • 1970-01-01
      • 2013-07-24
      相关资源
      最近更新 更多