【发布时间】:2019-09-10 03:35:12
【问题描述】:
使用 Firebase Firestore,我将聊天室详细信息存储在包含以下数据的文档中:
roomName
roomAvatar
createDate
isDeleted
我的应用程序和我的规则要求在“创建”文档时设置这些字段。但是,我也希望授权用户也可以“更新”文档。
我已经进行了检查,只允许某些用户更新文档并验证他们不允许修改像“createDate”这样的字段。但是,我似乎无法创建一个规则来强制授权用户不删除“createDate”字段,无论是通过传递 FiledValue.delete() 还是使用 ref.set(objectMissingCreateDate)。
最后,如果客户端只尝试更新一个或两个字段,我认为不应该要求客户端在更新时传递所有数据字段。
我有一个“更新”规则如下:
allow update: if isAuthenticated() && isMemberOfRoom() &&
(
(!("roomName" in request.resource.data) ||
request.resource.data.roomName == resource.data.roomName ||
hasRoomPermission("UpdateRoom")) &&
(!("roomAvatar" in request.resource.data) ||
request.resource.data.roomAvatar == resource.data.roomAvatar ||
hasRoomPermission("UpdateRoom")) &&
(!("createDate" in request.resource.data) ||
request.resource.data.createDate == resource.data.createDate) &&
(!("isDeleted" in request.resource.data) ||
request.resource.data.isDeleted == resource.data.isDeleted ||
hasRoomPermission("DeleteRoom"))
);
主要问题是保护数据不被授权用户传入 FieldValue.delete() 或使用 [Android] docRef.set() 而缺少必需的值。
我什至会接受为非管理员客户端关闭 FieldValue.delete() 和破坏性“设置”操作的功能。
【问题讨论】:
-
通过我对 Firestore 规则模拟器的实验,简单地说
allow write: if "foo" in request.resource.data;允许在以前存在时未指定 foo 的部分更新,并防御{foo: FieldValue.delete()}。 -
“我认为如果客户端只尝试更新一个或两个字段,我认为不应该要求客户端在更新时传递所有数据字段。”他们不必那样做。
request.resource包含允许更新时的值。因此,如果文档包含 3 个字段,其中一个已更新,request.resource包含这 3 个字段,如果允许更新,它们将是。 -
感谢您对规则流中数据评估方式的说明。我已经为我的问题添加了一个似乎有效的答案。我非常感谢 Firebase 团队的快速响应!
标签: firebase google-cloud-firestore firebase-security