在尝试为Android应用编写Firebase存储安全规则时,我遇到了一些意外行为。
为了测试一个简单的案例,我写了以下规则:
<div id="getnewsletterModal" class="newsletterReveal reveal-modal small" data-reveal aria-labelledby="modalTitle" aria-hidden="true" role="dialog">
<div class='iframe-container-newsletter'>
<iframe id="iframeNewsletter" src="" scrolling="no" style='border:0'></iframe>
</div>
<a class="close-reveal-modal" aria-label="Close">×</a>
效果是,如果我使用授权的写入uid - “6EP13cYABCciskhKwMTaXYZHS5g1”登录我的应用程序,我只能上传文件 - 但无论我登录哪个uid,我仍然可以读取文件。所以似乎只有写规则实际上是有效的;读取规则被忽略了。
为了进一步测试,我将规则重写为:
var appendIFrameNewsletter = true;
$(".getnewsletterModal").click(function() {
if(appendIFrameNewsletter) {
$('#iframeNewsletter').attr('src', '[url here]');
appendIFrameNewsletter = false;
}
});
这使我能够在登录我的应用程序时上传和读取文件:再次看起来只有写入规则有效。
有人能想到这可能的解释吗?
答案 0 :(得分:2)
您在问题的评论中解释说,您使用getDownloadUrl()来获取文件的网址。然后将URL传递给Glide,后者读取文件。 getDownloadUrl()
的文档指出URL可用于共享文件:
异步检索具有revokable的长期下载URL 令牌。这可以用来与其他人共享文件,但也可以 如果需要,由Firebase控制台中的开发人员撤消。
这向我建议,URL实际上是文件的“可共享链接”,并且当使用URL访问文件时,Firebase存储中定义的安全规则不适用。人们可以想到许多无法应用规则的情况。例如,当在Glide请求中使用URL时,请求不包含有关请求者的登录UID的信息,它只包含URL。
如果您想通过URL限制对文件的访问,我认为您只能通过限制对URL本身的访问来实现这一目的。