我正在努力应对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;
这里有什么想法吗?
答案 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)
您可能遇到问题有两个原因。
replace
函数已添加到“安全规则”中。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>