我正在尝试设计一个firestore模式,它允许许多组的人只编辑他们自己组的文档,但服务范围内的任何人都可以阅读它们。在firestore的安全规则设置中,这似乎是不可能的。
基于角色的访问
Firebase支持role-based access control,但它适用于整个服务的文档,我不能支持很多组。
自定义角色是通过gcloud控制台创建和分配的,因此我无法为每个组创建新的动态自定义角色,以便它们拥有自己的组。
Firestore触发复制文档
我考虑使用firestore触发器(onCreate、onUpdate、onDelete)将文档复制到同一组中的其他用户的子集。这样做的问题是它可能会创建一个无限的触发器循环,因为每个成员都可以更新一个文档。从理论上讲,您可以在复制的文档上使用一个属性集来防止这种情况发生,但它感觉有点笨拙和脆弱。
有没有最佳实践,或者Firestore不可能做到这一点?
发布于 2021-11-03 17:53:47
使用Custom Claims的Firebase身份验证可能非常适合此用例。您可以添加一个索赔groupId,并将其值设置为该用户所属的组的ID。如果用户可以是多个组的一部分,则存储一个groupIds数组。您可以在security rules中检查此groupId是否包含在用户的声明中。
您必须将groupId存储在每个文档中,这样我们才能知道该文档属于哪个组。您可以尝试以下规则:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /collection/{docId} {
allow read, write: if resource.data.groupId == request.auth.token.groupId;
}
}
}以上规则将允许用户仅当文档中的groupId与其自定义声明中的groupId匹配时才能读取和写入文档。
自定义声明只能在安全环境中使用Firebase Admin SDK进行更改,因此您可能必须使用云函数/服务器将用户添加到其各自的组中。
https://stackoverflow.com/questions/69829498
复制相似问题