Son*_*rma 8 firebase firebase-security google-cloud-firestore
我是安全规则的新手。我必须编写安全规则以防止用户更新除一个字段之外的文档。
假设我有一个文档
{ field1:一,field2:二,field3:三,。. . 字段:n }
登录的用户应该只能更新 field2。使用 Firestore 安全规则。
Fra*_*len 26
安全规则中没有明确的方法来验证正在发生的更新。但是你可以做的是在写操作之前和之后验证文档中的数据。通过比较这两者并了解文档可以包含哪些字段,您可以确保只能更新特定字段。
我经常在我的安全规则中使用这个小助手函数:
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, update) write。
最后,您可以要求某些字段,如在此创建规则中所示:
  allow create: if request.auth.uid == uid &&
    request.resource.data.keys().hasOnly(['lastIndex', 'lastUpdated']) &&
    request.resource.data.keys().hasAll(['lastIndex', 'lastUpdated']) 
因此,如果用户指定lastIndex和lastUpdated字段,则用户只能创建配置文件文档。如果他们指定任何额外的字段,或指定更少的字段,创建将被拒绝。
现在有了这些知识,我们可以回到您的需求,看看如何实现它。如前所述,您需要对每个单独的字段进行声明,而不要在那里使用通配符。因此,如果您的文档具有三个字段(field1、field2、 和field3),它们必须全部存在,并且用户只能更新field2,则类似于:
allow update: if request.resource.data.keys().hasAll(['field1', 'field2', 'field2']) &&
  isUnmodified('field1')) && isUnmodified('field3'));
现在可能有一种更短的方法可以通过使用此处显示的 set 和 map diff 操作来执行此操作:https : //firebase.google.com/support/release-notes/security-rules#february_13_2020,例如:
Run Code Online (Sandbox Code Playgroud)// This rule only allows updates where "a" is the only field affected allow update: if request.resource.data.diff(resource.data).affectedKeys().hasOnly(["a"]);
如果您更喜欢指定哪些字段可编辑的方法,我发现本教程中的一个部分很有帮助:Firebase 安全规则中的中级主题 - Firecast
// Make sure the request has only the specified allowed fields    
function editingOnlyAllowedFields(allowedFields) {
    let editedKeys = request.resource.data.diff(resource.data).affectedKeys();
    return editedKeys.hasOnly(allowedFields);
}
// Then, you can specify which fields you want to be updatable
allow update: editingOnlyAllowedFields(["field1", "field2"]);
| 归档时间: | 
 | 
| 查看次数: | 1769 次 | 
| 最近记录: |