java - 文件夹的 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);
}
});
解决方案
当您请求文件列表时,安全规则不会检查每个文件以确定是否将其包含在结果中,因为这样不会很好地执行。
相反,当请求进入时,安全规则会被静态评估。它们会根据规则检查请求,以查看请求是否会返回规则不允许的内容。
在您的代码中,由于您正在请求所有文件,因此该请求将被拒绝。如果您要获取一个特定文件,则规则能够检查该文件上的元数据,并可以安全地授予/拒绝访问它。
在 Firestore 和实时数据库上,您可以将代码中的查询与检查查询条件的规则结合起来,并以这种方式安全地查询数据。但是由于您无法在 Cloud Storage 上执行查询,因此您无法在商店中使用这种方法。
因此,对于文件列表,据我所知,您可以合理添加的唯一安全性是文件路径。如果您想要更多内容,我建议您将元数据复制到允许查询的数据库中,并在那里安全地查询它。
推荐阅读
- javascript - 使用包含方法从另一个数组中获取特定索引
- angular - 基于角色的角度路由
- c# - 在 IL 中 try-catch 是如何工作的?
- android - 我如何在 iOS / Android 中嵌入 NativeScript Angular 应用程序并从现有应用程序导航到某些路由
- python - 根据分隔符python的特定精度进行行拆分
- javascript - 链接到具有锚 div id 的另一个页面
- itext - PdfReader iText 很慢或我收到大文件的 Java 堆异常
- sql-server - 加入仅包括表中的最大日期
- javascript - 在另一个函数中使用填充在一个函数中的数组
- groovy - Fillo 在 Groovy 中获取记录计数失败