Firebase 如何禁止使用firestore规则更新某些字段?
我有一个特定的用户角色,只允许更新某些字段 这就是我的firestore规则在这种特殊情况下的样子:Firebase 如何禁止使用firestore规则更新某些字段?,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,我有一个特定的用户角色,只允许更新某些字段 这就是我的firestore规则在这种特殊情况下的样子: function isRoleUser () { return request.auth.token.role == 'user' } function isRoleAdmin () { return request.auth.token.role == 'admin' } ... allow update: if signedIn(
function isRoleUser () {
return request.auth.token.role == 'user'
}
function isRoleAdmin () {
return request.auth.token.role == 'admin'
}
...
allow update: if signedIn() && (
(
isRoleUser() && (
request.auth.uid == resource.id &&
!(request.resource.data.keys().hasAny(['disallowed1', 'disallowed2', 'disallowed3']))
)
) || (
isRoleAdmin()
)
);
我遇到的问题是,即使我没有更新不允许的字段,我仍然会收到消息说用户没有足够的权限
FirebaseError:缺少或权限不足
但是,如果我删除以下行:
!!request.resource.data.keys.hasAny['disallowed1','disallowed2',
“不允许3”]
我可以按预期更新用户,但显然我将失去我想要施加的限制。我的规则有问题吗?如果是,我如何防止用户更新列出的字段
谢谢 request.resource.data.keys始终包含描述文档(如果写入成功)的整个字段集。它不仅仅包含要更改的字段。因此,如果要限制对某些字段的写入访问,需要检查规则中该字段的内容是否发生了更改。您必须针对每个字段以及相关角色单独执行此操作
因此,对于field foo:
request.resource.data.foo != resource.data.foo
我经常在规则中使用这个小助手函数:函数isUnmodifiedkey{return request.resource.data[key]==resource.data[key]}