允许在Firestore中更新特定的嵌套值

Mar*_*oet 6 javascript firebase-security google-cloud-firestore firebase-security-rules

我需要让匿名用户能够更新嵌套体系结构中的特定值,而无需对文档的其余部分授予权限.

events 是一个顶级集合,我更新我的文档是这样的

update(`events/${event.id}`, {
  [`boardgames.${boardgameId}.votes.${uid}`]: true,
})
Run Code Online (Sandbox Code Playgroud)

我试过这个解决方案

allow update: if ((request.writeFields.size() == 1) && ('boardgames' in request.writeFields));
Run Code Online (Sandbox Code Playgroud)

这里提到但它失败了(两个半部也独立失败).

我错过了什么?当'进入'嵌套对象时,我不会只更新一个字段吗?

能够console.log request和它是非常有帮助的request.writeFields.

注意,理想情况下我只想允许修改最深的属性,当前用户的uid内部votes.

l1b*_*rty 0

实际上,request.writeFields捕获已修改字段的完整路径,因此在您的情况下它将等于boardgames.${boardgameId}.votes.${uid}.

您可以将正则表达式与String.matches一起使用

allow update: if request.auth.uid != null
  && request.writeFields.size() == 1
  && request.writeFields[0].matches("boardgames\.[^.]{5,25}\.votes\." + request.auth.uid)
Run Code Online (Sandbox Code Playgroud)

小心: request.writeFields 已被弃用,但不幸的是没有好的替代品可以解决您的问题