对于我的生活,我无法理解为什么以下导致false允许写入.假设我的users集合是空的,我正在从我的Angular前端编写以下表单的文档:
{
displayName: 'FooBar',
email: 'foo.bar@example.com'
}
Run Code Online (Sandbox Code Playgroud)
我目前的安全规则:
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
function isAdmin() {
return resource.data.role == 'ADMIN';
}
function isEditingRole() {
return request.resource.data.role != null;
}
function isEditingOwnRole() {
return isOwnDocument() && isEditingRole();
}
function isOwnDocument() {
return request.auth.uid == userId;
}
allow read: if isOwnDocument() || isAdmin();
allow write: if !isEditingOwnRole() && (isOwnDocument() || isAdmin());
}
}
}
Run Code Online (Sandbox Code Playgroud)
一般来说,我希望没有用户能够编辑自己的角色.普通用户可以编辑自己的文档,管理员可以编辑任何人.
Stubbing isEditingRole()for false给出了预期的结果,所以我把它缩小到那个表达式.
写入不断变回虚假,我无法确定原因.任何想法或修复都会有所帮助!
编辑1
我试过的事情:
function …Run Code Online (Sandbox Code Playgroud) 我想让用户有权更新文档.但仅限用户更新此文档的一个特定字段.此用户不应更改所有其他字段.
这可能在火店吗?
我试过这样的事情:
function isUpdateToOpenField(attr) {
return attr == get(/databases/$(database)/documents/stores/$(store)).data.open;
}
allow update: if isUpdateToOpenField(request.resource.data);
Run Code Online (Sandbox Code Playgroud)
但我不知道如何比较更新是否对应于正确的字段.
firebase-security google-cloud-firestore firebase-security-rules
我正在从客户端进行批处理操作以仅更新一个字段,但是在进行批处理操作和安全规则测试时发现正在更新多个字段。我使用request.resource.data.size() >1并request.resource.data.keys().size()>1返回true(文档正在更新)检查了这个,但这不是因为我想检查安全规则,只有一个字段正在使用检查更新,request.resource.data.keys().hasOnly(['someFieldToUpdate'])但现在不起作用,以前我记得有writeFields检查但是它现在没有出现在文档中,这个答案也提到了它。那么如何检查现在在批处理操作中实际更新的字段?