【发布时间】:2017-01-10 08:05:39
【问题描述】:
我在尝试为 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;
}
}
}
这让我可以在登录到我的应用程序时上传和读取文件:似乎只有写入规则是有效的。
谁能想到一个可能的解释?
【问题讨论】:
-
我无法使用 9.4.0 版重现您的结果。我使用
putBytes()/getBytes()和Task侦听器来检测成功和失败。对于您发布的两组规则,我可以编写但读取权限失败。您能否提供更多关于您使用什么方法进行读/写以及如何感知读取状态的详细信息? -
@qbix - 感谢您对此的帮助。我也有 9.4.0 版。对于上传,我使用
StorageReference.putFile(Uri)。这将返回一个UploadTask,我在其中添加了一个onSuccessListener。上传完成后,监听器会调用taskSnapshot.getDownloadUrl()。 Url 被发送到下载者可以访问的实时数据库中的“firebaseUri”字段。 “firebaseUri”字段中的更改会触发在FirebaseRecyclerAdapter中对populateViewHolder()的调用,然后使用 Glide 加载图像。图像确实加载了,因此读取一定是成功的。
标签: android firebase firebase-security firebase-storage