我一直在努力尝试使用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';
}