gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:54:23 24 4
gpt4 key购买 nike

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

可以说我有一个医生

{
field1:一个,
field2:两个,
field3:三个,



场数:n
}

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

最佳答案

安全规则中没有明确的方法来验证正在发生的更新。但是您可以做的是在写操作之前和之后验证文档中的数据。通过比较这两个字段,并知道文档可以包含哪些字段,可以确保仅可以更新特定的字段。
我经常在我的安全规则中使用此辅助功能:

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规则上使用了更细化的 Action ( 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'));

如今,可以使用显示在此处的set和map diff操作来实现此目的的更短方法: https://firebase.google.com/support/release-notes/security-rules#february_13_2020类似:
// 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 - 安全规则,允许更新特定字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58143344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com