文件夹的Firebase存储安全规则

时间:2020-07-09 12:28:23

标签: java android firebase-storage firebase-security

我正在构建一个具有组的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);
           }
      });

1 个答案:

答案 0 :(得分:0)

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

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

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

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

因此,据我所知,对于文件列表,可以合理添加的唯一安全性是文件的路径。如果您还需要其他信息,建议您在允许查询的数据库中复制元数据,然后在其中安全地查询它。