在firestore安全规则中使用replace函数

时间:2017-11-02 08:37:14

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

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

例如,这有效:

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')

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

SELECT i.*
FROM   ITEM i
       INNER JOIN
       (
         SELECT ROWNUM AS rn,
                COLUMN_VALUE AS value
         FROM   TABLE( SYS.ODCINUMBERLIST( 45, 2, 671, 6 ) )
       ) v
       ON ( i.ITEM_ID = v.VALUE )
ORDER BY v.RN;

这里有什么想法吗?

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

var emailSanitized = email.replace(&#39;。&#39;,&#39;。&#39;); db.collection(&#39; someCollection&#39;)。其中(&#39;成员。&#39; + emailSanitized,&#39; ==&#39;,&#39; admin&#39;)< / p>