【问题标题】:Firebase Storage security rules for folders文件夹的 Firebase 存储安全规则
【发布时间】:2020-10-30 01:06:09
【问题描述】:

我正在构建一个具有组的 android 应用程序,Firebase 存储的路径以 /{groupId}/Images/ 开头,并且我使用文件元数据添加了安全规则。但是,当我尝试列出 Images 文件夹的内容时,规则会失败,因为文件夹没有元数据。我该如何解决这个问题?

有没有一种方法可以让我从安全规则中的图像文件夹中访问一些随机图像,并通过查看其元数据来授予权限。另外,我不能使用自定义令牌,因为在注册期间不知道 groupId。目前编写的安全规则如下:

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{groupId}/Images/{allPaths=**} {
          allow read: if request.auth.uid in resource.metadata.keys() && groupId in resource.metadata.keys();
          allow write: if request.auth.uid in request.resource.metadata.keys() && groupId in request.resource.metadata.keys();
            
    }
  }
}

这些规则失败的代码是:

storageReference = FirebaseStorage.getInstance().getReference();
StorageReference listRef = storageReference.child(groupId).child("Images");

listRef.listAll().addOnSuccessListener(new OnSuccessListener<ListResult>() {
      @Override
      public void onSuccess(ListResult listResult) {
           for (StorageReference prefix : listResult.getPrefixes()) {
                Log.d(TAG, "Storage reference prefix is: "+prefix);
           }

           for (StorageReference item : listResult.getItems()) {
                Log.d(TAG, "Storage reference item is: "+item);
           }
      }
      })
      .addOnFailureListener(new OnFailureListener() {
           @Override
           public void onFailure(@NonNull Exception e) {
               Log.w(TAG, "listRef on storage failed: ",e);
           }
      });

【问题讨论】:

  • 请编辑您的问题以包含我们可以重现问题的最少规则和代码。 “寻求调试帮助的问题('为什么这段代码不起作用?')必须包括所需的行为、特定问题或错误必要的最短代码 重现它在问题本身。没有明确的问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example."
  • @FrankvanPuffelen 现在可以了吗?
  • 谢谢。现在,您还可以显示当您违反这些规则运行它时失败的代码吗?
  • @FrankvanPuffelen 完成

标签: java android firebase-storage firebase-security


【解决方案1】:

当您请求文件列表时,安全规则不会检查每个文件以确定是否将其包含在结果中,因为这样做效果不佳。

当请求进入时,安全规则会被静态评估。它们会根据规则检查请求,以查看请求是否会返回规则不允许的内容。

在您的代码中,由于您要请求所有文件,因此该请求将被拒绝。如果您要获取一个特定文件,则规则能够检查该文件上的元数据,并可以安全地授予/拒绝对其的访问权限。

在 Firestore 和实时数据库上,您可以将代码中的查询与检查查询条件的规则结合起来,并以这种方式安全地查询数据。但由于您无法在 Cloud Storage 上执行查询,因此您无法在 store 中使用这种方法。

因此,据我所知,对于文件列表,您可以合理添加的唯一安全措施是文件路径。如果您想要更多内容,我建议您将元数据复制到允许查询的数据库中,并在那里安全地查询。

【讨论】:

  • 感谢您的回复弗兰克。但是 Firestore/实时数据库中的元数据复制如何确保除了组成员之外没有人可以列出 Images 文件夹的内容?而且,在最坏的情况下,如果在这种情况下我无法为文件夹添加任何安全性,应如何修改安全规则以允许列表功能正常工作。
  • 在这种情况下,您将完全禁用存储中的列表文件。在 v2 之前,这实际上是唯一的选择,因为无法通过 Firebase SDK 列出文件。
猜你喜欢
  • 2021-01-06
  • 2021-01-03
  • 2020-07-03
  • 2020-03-24
  • 2022-01-18
  • 1970-01-01
  • 2016-09-27
  • 2021-09-21
相关资源
最近更新 更多