目前,我对Firestore有一个非常简单的方案。顶层是“工作区”的集合。每个“工作区”都包含“文档”的集合。
我需要能够在Workspace级别或Document级别设置权限。我遵循了其他答案的建议,并在每个对象中创建了一个“ __permissions”对象,该对象在UID上进行了键控并记录了权限级别(0表示无,1、2 ...最终将控制用户是否具有读取或写入权限。
我创建了如下所示的规则:
service cloud.firestore {
match /databases/{database}/documents {
match /workspaces/{spaceId} {
function parentSpacePermission(uid) {
return get(/databases/$(database)/documents/workspaces/$(spaceId)).data.__permissions[uid] > 0;
}
allow read: if (request.auth != null) && (parentSpacePermission(request.auth.uid) || request.auth.uid == "dingo");
match /document/{documentId} {
// ADDED FOR SO CLARITY: THIS IS THE PROBLEMATIC RULE
allow read: if (resource.data.__permissions[request.auth.uid] > 0) || parentSpacePermission(request.auth.uid);
}
}
match /{document=**} {
allow read, write: if false;
}
}
}
很遗憾,文档级规则不起作用。如果尝试使用对父级具有权限的UID(使用模拟器),则会收到错误消息“对象上的属性未定义”。如果我使用子规则的EITHER(而不是OR),则它们可以正常工作。如果我颠倒顺序,它将更改哪些规则有效,哪些无效。我试过做过!= null检查,但似乎无济于事。
任何有关如何进行这种级联的想法将不胜感激。
我了解我可以使用云功能有效地使子对象成为其自身权限的完整事实来源-希望查看是否存在较少的写密集型方式(因为更新工作空间上的权限可能导致数以千计的写入操作来更新其中的每个文档)。