我正在构建一个具有组的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);
}
});
答案 0 :(得分:0)
当您请求文件列表时,安全规则不会检查每个文件来确定是否将其包括在结果中,因为这样做效果不佳。
当请求进入时,安全规则会被静态评估。它们会根据规则检查请求,以查看请求是否可能返回规则不允许的内容。
在您的代码中,由于您正在请求所有文件,因此该请求将被拒绝。如果您要获取一个特定文件,则规则可以检查该文件上的元数据,并可以安全地授予/拒绝对该文件的访问。
在Firestore和实时数据库上,您可以将代码中的查询与规则结合使用,然后再检查查询条件,并以此方式安全地查询数据。但是,由于您无法在Cloud Storage上执行查询,因此无法在商店中使用此方法。
因此,据我所知,对于文件列表,可以合理添加的唯一安全性是文件的路径。如果您还需要其他信息,建议您在允许查询的数据库中复制元数据,然后在其中安全地查询它。