【发布时间】:2020-12-15 22:08:00
【问题描述】:
我正在尝试为文档更新编写 Firebase 安全规则,以实现以下目标:
- 用户是文档的所有者
- 强制在请求中只显示用户名、电子邮件、修改和活动(即没有额外的字段)
- 防止创建的日期出现在请求中和/或被覆盖/更新
这是我的安全规则:
function isAuthenticated(){
// Determine if the requesting user is authenticated
return request.auth.uid != null;
}
function isUser(uid) {
// Determine if the requesting user is the user
return isAuthenticated() && request.auth.uid == uid;
}
function verifyFields(required, optional) {
let allAllowedFields = required.concat(optional);
return request.resource.data.keys().hasAll(required) &&
request.resource.data.keys().hasOnly(allAllowedFields);
}
match /users/{uid} {
allow read: if isUser(uid);
allow create: if isUser(uid) && verifyFields(['username', 'email','created','modified','active'],['roles']);
allow update: if isUser(uid) && request.resource.data.diff(resource.data).affectedKeys().hasOnly(['username','email','modified','active']);
allow delete: if isUser(uid);
创建规则运行没有问题,但是更新规则失败,因为 request.resource.data 是一个包含所有未来文档键的映射,因此它将包含创建时文档中的所有键,例如 created 字段.
有什么想法可以强制密钥存在但也强制密钥不能更新?
谢谢。
【问题讨论】:
标签: firebase google-cloud-firestore firebase-security