Cloud Firestore安全规则 - 仅允许写入文档中的特定密钥

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (18)

我目前正在使用Firestore数据库为我的应用编写一些规则。目前,每个人都可以读取数据,经过身份验

  match /quizzes/{quizId} {
    allow read; 
    allow write: if request.auth != null;
  }

这工作正常,但我也希望未经身份验证的用户只能写入文档中的特定键。

文档的示例内容:

{
  title: 'title',
  plays: 12,
  playedBy: [//Filled with user id's],
  ...
}

是否有任何方法可以限制未经身份验证的用户只能对playingBy数组进行写访问,而不限制该文档的其他键?

提问于
用户回答回答于

让我们从最简单的例子开始。像这样的东西允许未经身份验证的用户编写playedBy,只要这是文档中唯一的字段:

if request.auth != null || request.resource.data.keys().hasOnly(['playedBy'])

如果未经身份验证的用户正在创建新文档或更新现有文档,则此方法有效。但是一旦文档包含更多字段,它就会停止,因为request.resource.data包含写入成功后文档将具有的所有字段。

因此,更好的选择是检查是否只playedBy修改了,并且所有其他字段具有与以前相同的值。在那里处理不存在的字段是棘手的,我通常使用一些辅助函数来处理:

function isUnmodified(key) {
  return request.resource.data[key] == resource.data[key]
}
function isNotExisting(key) {
  return !(key in request.resource.data) && (!exists(resource) || !(key in resource.data));
}

然后:

if request.auth != null &&
  request.resource.data.keys().hasOnly(['title', 'plays', 'playedBy']) &&
  isUnmodified('title') && 
  isUnmodified('plays')

确切的规则可能有点偏,但我希望这足以让你自己完成它。

扫码关注云+社区

领取腾讯云代金券