Firestore安全规则拆分连接方法无法按预期运行

时间:2019-03-05 00:30:18

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

我面临两个问题:

  • 您不能更改句号“。”当您使用“ request.auth.token.email”之类的东西时,“ firebase规则”中的字符(操作字符串和连接的选项非常有限,不支持替换功能)
  • 由于使用哈希映射,因此您不能在查询中使用电子邮件,因为它与'key'的句点字符相同。

由于上述问题,放弃使用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”身份登录

以上设置无效。我收到权限被拒绝的错误。 我不知道我在做什么错,请帮忙。

2 个答案:

答案 0 :(得分:0)

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

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

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

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

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

答案 1 :(得分:0)

keybd_event使用正则表达式作为参数,因此split实际上可以匹配任何字符。

除了修复之外,您还可以使用替换功能替换字符串:

.