我是安全规则的新手。我必须编写安全规则,以防止用户更新一个字段以外的文档。
让我说我有文档
{ field1:一个, field2:两个, field3:三个 。 。 。 场数:n }
登录用户应该只能更新field2。 使用Firestore安全规则。
答案 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
规则上使用了更细粒度的操作(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'));