相关疑难解决方法(0)

Firestore安全规则 - 如何检查字段是否被修改?

对于我的生活,我无法理解为什么以下导致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)

firebase firebase-security google-cloud-firestore

13
推荐指数
3
解决办法
5541
查看次数

允许在firestore中对单个字段进行更新

我想让用户有权更新文档.但仅限用户更新此文档的一个特定字段.此用户不应更改所有其他字段.

这可能在火店吗?

我试过这样的事情:

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

7
推荐指数
4
解决办法
2118
查看次数

Firestore 安全规则中的更新字段数

我正在从客户端进行批处理操作以仅更新一个字段,但是在进行批处理操作和安全规则测试时发现正在更新多个字段。我使用request.resource.data.size() >1request.resource.data.keys().size()>1返回true(文档正在更新)检查了这个,但这不是因为我想检查安全规则,只有一个字段正在使用检查更新,request.resource.data.keys().hasOnly(['someFieldToUpdate'])但现在不起作用,以前我记得有writeFields检查但是它现在没有出现在文档中,这个答案也提到了它。那么如何检查现在在批处理操作中实际更新的字段?

firebase firebase-security google-cloud-firestore

2
推荐指数
1
解决办法
761
查看次数