首页 > 解决方案 > 文件夹的 Firebase 存储安全规则

问题描述

我正在构建一个具有组的 android 应用程序,并且 Firebase 存储的路径以 /{groupId}/Images/ 开头,并且我使用文件元数据添加了安全规则。但是,当我尝试列出 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);
           }
      });

标签: javaandroidfirebase-storagefirebase-security

解决方案


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

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

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

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

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


推荐阅读