安全规则,允许更新特定字段

时间:2019-09-28 04:24:39

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

我是安全规则的新手。我必须编写安全规则,以防止用户更新一个字段以外的文档。

让我说我有文档

{  field1:一个,  field2:两个,  field3:三个  。  。  。  场数:n }

登录用户应该只能更新field2。 使用Firestore安全规则。

1 个答案:

答案 0 :(得分:2)

安全规则中没有明确的方法来验证正在发生的更新。但是您可以进行的操作是在写入操作之前 之后验证文档中的数据。通过比较这两个字段,并知道文档可以包含哪些字段,可以确保仅可以更新特定字段。

我经常在我的安全规则中使用此辅助功能:

function isUnmodified(key) {
  return request.resource.data[key] == resource.data[key]
}

顾名思义,它确保此写请求中未修改特定键/字段。例如,此规则仅允许用户更新其个人资料文档,只要他们不修改name字段(除非他们是管理员)即可。

allow update: if isAdmin(request) || 
  (request.auth.uid == uid && isUnmodified(request, resource, 'name'));

我还具有此帮助程序功能,该功能检查是否存在特定字段:

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

这很重要,因为有时您希望只允许将字段写入一次,或者仅允许对其进行更新(如果已存在)。有时,我为此使用isNotExisting,但如今,我发现自己在汇总create规则上使用了更细粒度的操作(updatewrite)。

最后,您可以要求某些字段,如创建规则中所述:

  allow create: if request.auth.uid == uid &&
    request.resource.data.keys().hasOnly(['lastIndex', 'lastUpdated']) &&
    request.resource.data.keys().hasAll(['lastIndex', 'lastUpdated']) 

因此,用户只有在指定lastIndexlastUpdated字段的情况下才能创建配置文件。如果他们指定其他任何字段,或指定的字段较少,则创建将被拒绝。

现在,有了这些知识,我们可以回到您的要求,并了解如何实现它。如前所述,您将需要在每个字段上声明,而不必在其中使用通配符。因此,如果您的文档具有三个字段(field1field2field3),这些字段必须全部存在,并且用户只能更新field2,那一定是喜欢:

allow update: if request.resource.data.keys().hasAll(['field1', 'field2', 'field2']) &&
  isUnmodified('field1')) && isUnmodified('field3'));