首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >允许更新特定字段的安全规则

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

Stack Overflow用户
提问于 2019-09-28 04:24:39
回答 2查看 2.5K关注 0票数 8

我对安全规则很陌生。除了一个字段之外,我还必须编写安全规则,以防止用户更新文档。

我有个医生

{ field1 :1,field2 :2,field3 :3,。。。fieldn :n}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-28 07:19:16

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

我经常在安全规则中使用这个小助手函数:

代码语言:javascript
复制
function isUnmodified(key) {
  return request.resource.data[key] == resource.data[key]
}

顾名思义,它确保在这个写请求中不会修改某个键/字段。例如,这个规则只允许用户更新他们的概要文件,只要他们不修改name字段(除非他们是管理员):

代码语言:javascript
复制
allow update: if isAdmin(request) || 
  (request.auth.uid == uid && isUnmodified(request, resource, 'name'));

我还有这个助手函数,它检查某个特定字段是否存在:

代码语言:javascript
复制
function isNotExisting(key) {
  return !(key in request.resource.data) && (!exists(resource) || !(key in resource.data));
}

这一点很重要,因为有时您希望只编写一次字段,或者只允许在字段已经存在的情况下更新该字段。有时我会使用isNotExisting,但现在我发现自己更多地使用了更细粒度的操作(createupdate)而不是聚合write规则。

最后,您可以需要某些字段,如此创建规则中的:

代码语言:javascript
复制
  allow create: if request.auth.uid == uid &&
    request.resource.data.keys().hasOnly(['lastIndex', 'lastUpdated']) &&
    request.resource.data.keys().hasAll(['lastIndex', 'lastUpdated']) 

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

现在,有了这些知识,我们就可以回到您的需求,并了解如何实现它。如前所述,您需要在每个单独的字段上声明,而不需要在其中使用通配符。因此,如果您的文档有三个字段(field1field2field3),这些字段都必须存在,而且用户只能更新field2,则如下所示:

代码语言:javascript
复制
allow update: if request.resource.data.keys().hasAll(['field1', 'field2', 'field2']) &&
  isUnmodified('field1')) && isUnmodified('field3'));

现在可能有一种更短的方法可以通过使用这里显示的set和map diff操作来做到这一点:2020年类似于:

//此规则只允许"a“是唯一受影响的字段允许更新:如果是request.resource.data.diff(resource.data).affectedKeys().hasOnly("a");

票数 27
EN

Stack Overflow用户

发布于 2021-09-11 07:21:50

如果您更喜欢方法来指定哪些字段可以编辑,我发现本教程中有一节是有用的:Firebase安全规则的中间主题-Firecast

代码语言:javascript
复制
// 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"]);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58143344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档