这是我的数据结构:
folders(collection): {
folderA: {
members: { user123: { role: "author" } }
folders(collection): {
folderB: {
parent(reference): /folders/folderA
members: { userABC: { role: "author" } }
folders(collection): {
folderC: {
parent(reference): /folders/folderA/folders/folderB
fieldA: { content: 'x' }
}
}
}
}
}
}
users: {
user123 :{
name: John
}
userABC :{
name: Bob
}
}
我的目标是允许作为当前请求文档上方任何父级成员的用户访问文档。希望允许 user123 (John)和 userABC (Bob)都可以访问 fieldA ,而无需编写特定于 folderA的规则, folderB和folderC 。想法是,可能至少有20个深度的文件夹。
尽管我知道规则功能是有限的,但是我还是希望能为这种情况编写规则:
match /databases/{database}/documents {
match /{path=**} {
allow get: if resource.data.members[request.auth.uid].role == 'author';
allow get: if isParentAuthor(resource);
function isParentAuthor(resource){
if(exists(resource.data.parent) {
if( get(resource.data.parent.path).data.members[request.auth.uid].role == 'author' ) {
return true;
} else {
return isParentAuthor( get(resource.data.parent.path) );
}
} else {
return false
}
}
}
}
现在,我对硬编码到规则中的文件夹有许多访问权限。但是能够递归地执行此操作将是很棒的。那可能吗?我知道这会造成可能存在大量文档请求的情况,但是我认为我通常对此表示同意。但是,也许还有更多的Firebase-y方法可以减少请求,从而实现这一目标?
答案 0 :(得分:0)
安全规则存在局限性,无法执行您在此所说的话。
首先,每个规则调用限制为10个文档。这是一个硬性限制。
第二,不允许递归。如果一个函数调用该规则,则该规则将立即失败。
根据评论中的建议,展平您的收藏。在文档中放置一个字段,以指示与其他文档相比在逻辑上嵌套的位置。对于Cloud Firestore来说,拥有大量收藏并不是什么大不了的事情。您将可以根据需要过滤尽可能多的内容。