处理文档上的多级安全规则

时间:2019-07-16 10:19:00

标签: firebase google-cloud-firestore firebase-security-rules

我一直在努力尝试使用security rules处理Firestore的多个级别的权限。实际上,我只是从Firebase RTDB迁移到Firestore,以为它不会那么复杂,但是在安全性方面我仍然面临同样的问题。

我的文档结构很简单:它包含一个名为 permissions 的字段,用于定义每个用户的权限。 这是文档 tasks

下的键为 task1 的文档
/tasks/task1
{
  "id":"tra",
  "title":"asdf",
  "duration":5,
  "progress":5,
  "comments":[],
  "permissions": {,
    "user1": "viewer",
    "user2": "commentator",
    "user3": "editor",
    "user4": "creator",
  }
}

规则:

阅读

用户必须经过身份验证,并且至少具有“查看者”权限

我的工作解决方案

  match /tasks/{userId} {
        allow read: if request.auth.uid!=null &&
        resource.data.permissions[request.auth.uid]!=null;
      }

创建

1)任何经过身份验证的用户都可以创建任务,但是该用户的权限字段必须为{ $ userId :“ creator ”}

match /tasks/{userId} {
        allow create: if request.resource
        .data.permissions[request.auth.uid] =='creator';
      }

更新(这是复杂的地方)

1)仅当尝试更改字段权限的用户具有编辑者创建者权限

时,才能更改字段权限。

2)拥有编辑者权限的用户可以在权限字段中添加任何用户,只要该新用户的权限不是 creator

3)具有“ 查看者”权限或没有权限的用户无法更新任何字段。

4)具有“ 注释器”的用户只能更改字段注释。

5)具有“ 创建者”的用户可以更改任何字段。

6)任何更改都必须始终与验证模式匹配:

{
  "id":String,
  "title":String,
  "duration":Number,
  "progress":Number,
  "comments":Array of String,
  "permissions": {,
    "$id":Existing $UserId from collection users/ : "viewer" | "comments" | "editor" |"creator",
  }
}

删除

1)只有拥有创建者权限的用户才能删除文档

到目前为止,我已经能够实现读/创建/删除规则,但是我不知道在更新规则中写什么

match /tasks/{userId} {
        allow read: if request.auth.uid!=null &&
        resource.data.permissions[request.auth.uid]!=null;
        allow create: if request.resource
        .data.permissions[request.auth.uid] =='creator';
        allow delete: if request.resource
        .data.permissions[request.auth.uid] =='creator';

      }

0 个答案:

没有答案