【问题标题】:Using the replace function in firestore security rules在 Firestore 安全规则中使用替换功能
【发布时间】:2018-04-14 17:06:45
【问题描述】:

我正在努力解决 Firestore 安全规则。我想检查需要替换功能的值,即电子邮件地址。我可以在一般安全文档中找到一些文档,但这似乎不适用于 Firestore。

例如这有效:

allow write: if resource.data.members.data[(request.auth.token.email)] in ["admin"];

但这没有(我相应地更改了成员对象中的键):

allow write: if resource.data.members.data[(request.auth.token.email.replace('.' , ',')] in ["admin"];

另一种选择是在查询地址中使用点,因此不必像这样替换它们:

var emailSanitized = email.replace('.' , '.');
db.collection('someCollection').where('members.' + emailSanitized, '==', 'admin')

这里有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    有点晚了,但是你可以用这个来模拟一个字符串的替换函数:

    function replace(string, replace, by) {
      return string.split(replace).join(by);
    }
    

    所以你需要在你的 firestore.rules 文件中定义这个函数,然后你可以调用 replace(request.auth.token.email, '.' , ',') 来获得与 javascript 中的 request.auth.token.email.replace('.' , ',') 相同的结果。

    【讨论】:

      【解决方案2】:

      您可能遇到问题的原因有两个。

      1. 在您提出问题后,replace 函数已添加到安全规则中。
      2. replace 函数对第一个参数使用正则表达式,因此匹配 '.' 将匹配所有内容。

      考虑改用:request.auth.token.email.replace('\\.' , ',')

      【讨论】:

        【解决方案3】:

        var emailSanitized = email.replace('.' , '.'); db.collection('someCollection').where('members.' + emailSanitized, '==', 'admin')

        【讨论】:

        • 请添加的不仅仅是代码。解释为什么你的答案是正确的。
        • 我可以看到我在这段代码中用点替换点打错了,但第二个实际上是逗号。
        • 我收到了 Firestore 支持的回复,Firestore 中尚不支持 Replace 功能。
        猜你喜欢
        • 2020-04-29
        • 2018-11-09
        • 2019-11-09
        • 1970-01-01
        • 2019-12-27
        • 2020-01-14
        • 2018-10-19
        • 2019-07-05
        • 2020-07-07
        相关资源
        最近更新 更多