我有一个特定的用户角色,只允许更新某些字段。
在这种特殊情况下,我的Firestore规则如下所示:
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', 'disallowed3']))
我可以按预期更新用户,但是显然我将失去我想要施加的限制。我的规则有问题吗?如果是这样,如何防止用户更新列出的字段?
谢谢!
答案 0 :(得分:1)
request.resource.data.keys()
始终包含描述文档(如果写入成功)的整个字段集。它不仅包含将要更改的字段。因此,如果您想限制对某些字段的写访问,则需要检查该字段的内容在规则中是否发生了变化。对于所涉及的角色,您将必须针对每个字段分别执行此操作。
因此,对于foo字段:
request.resource.data.foo != resource.data.foo