我在尝试为 Android 应用编写 Firebase 存储安全规则时遇到了一些意外行为。
为了测试一个简单的案例,我编写了以下规则:
service firebase.storage {
match /b/<my-firebase-storage-bucket>/o {
match /{allPaths=**} {
allow read: if request.auth.uid == "mystery";
allow write: if request.auth.uid == "6EP13cYABCciskhKwMTaXYZHS5g1";
}
}
}
结果是,如果我使用授权的写入 uid“6EP13cYABCciskhKwMTaXYZHS5g1”登录到我的应用程序,我只能上传文件,但无论我使用哪个 uid 登录,我仍然可以读取文件。所以看起来只有写规则是有效的;读取规则被忽略。
为了进一步测试,我将规则重写为:
service firebase.storage {
match /b/<my-firebase-storage-bucket>/o {
match /{allPaths=**} {
allow read: if false;
allow write: if true;
}
}
}
这允许我在登录到我的应用程序时同时上传和读取文件:再次似乎只有写入规则有效。
谁能想到一个可能的解释?
最佳答案
您在您使用的问题下的评论中解释了 getDownloadUrl()获取文件的 URL。然后,您将 URL 传递给 Glide,Glide 会读取该文件。 getDownloadUrl()
的文档指出该 URL 可用于共享文件:
Asynchronously retrieves a long lived download URL with a revokable token. This can be used to share the file with others, but can be revoked by a developer in the Firebase Console if desired.
在我看来,这表明该 URL 实际上是指向文件的“可共享链接”,并且当该 URL 用于访问该文件时,Firebase 存储中定义的安全规则不适用。人们可以想到许多不可能应用规则的情况。例如,当在 Glide 请求中使用 URL 时,该请求不包含有关请求者已登录 UID 的信息,它只包含 URL。
如果您想通过 URL 限制对文件的访问,我认为您只能通过限制对 URL 本身的访问来实现。
关于android - 忽略 Firebase 存储安全读取规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39288457/