考虑以下Firebase Storage安全规则:
rules_version = '2';
service firebase.storage {
function postRef(postId) {
return /databases/(default)/documents/posts/$(postId);
}
match /b/{bucket}/o {
match /posts/{postId}/images/{imageId} {
allow create: if request.auth != null
&& firestore.get(firestore.get(postRef(postId)).data.topic).data.something;
}
}
}
post
文档的topic
字段包含一个格式为topic/{topicId}
的引用数据类型的值。
我面临的问题是,函数firestore.get
接受/databases/(default)/documents/posts/{postId}
格式的路径,然而,从函数firestore.get
返回的post
文档的topic
字段中的引用包含/projects/my-project/databases/(default)/documents/topic/{topicId}
格式的路径-注意它以项目id为前缀。
这会导致一个错误,因为firestore.get
函数期望的路径没有项目id (/databases/(default)/documents/topic/{topicId}
)。
有趣的是,Firebase Firestore安全规则中使用的相同规则工作得很好,在获取时项目为参考值添加前缀没有问题。
我的问题是,是否有一些方法,使用Firebase存储安全规则,使此工作?我有一个替代解决方案,涉及从Firestore中删除引用数据类型,并用文档ID的字符串值替换它们。但是,我希望避免这种解决方案,因为它会引入不必要的代码库重构。
目前,Firebase文档本身没有替代的解决方案。对于这个问题,您现在可能不得不坚持使用您的变通方法。跨服务安全规则对于Firebase来说仍然是新的。所有可用的功能都在本文档中说明。
你可能需要为这种情况提交一个特性请求。