我对安全规则很陌生。除了一个字段之外,我还必须编写安全规则,以防止用户更新文档。
我有个医生
{ field1 :1,field2 :2,field3 :3,。。。fieldn :n}
登录的用户应该只能更新field2。使用消防安全规则。
发布于 2019-09-28 07:19:16
安全规则中没有明确的方法来验证正在发生的更新。但是,您可以做的是在写操作之前和之后验证文档中的数据。通过比较这两个字段,并通过了解文档可以包含哪些字段,可以确保只更新特定字段。
我经常在安全规则中使用这个小助手函数:
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操作来做到这一点:2020年类似于:
//此规则只允许"a“是唯一受影响的字段允许更新:如果是request.resource.data.diff(resource.data).affectedKeys().hasOnly("a");
发布于 2021-09-11 07:21:50
如果您更喜欢方法来指定哪些字段可以编辑,我发现本教程中有一节是有用的: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"]);https://stackoverflow.com/questions/58143344
复制相似问题