忽略 Firebase 存储安全读取规则

Firebase Storage security read rule ignored

我在尝试为 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,它会读取文件。 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 实际上是文件的“可共享 link”,当 URL 用于时,Firebase 存储中定义的安全规则不适用访问文件。人们可以想到许多不可能应用规则的情况。例如,当在 Glide 请求中使用 URL 时,该请求不包含有关请求者登录 UID 的信息,它仅包含 URL.

如果您想通过 URL 限制对文件的访问,我认为您只能通过限制对 URL 本身的访问来实现。