gpt4 book ai didi

android - Firebase 存储规则

转载 作者:行者123 更新时间:2023-11-30 00:38:50 25 4
gpt4 key购买 nike

我是 Firebase 的新手,所以希望这是一个简单的修复 ...

我有几个基本的存储规则设置只是为了测试,但是似乎没有遵守限制上传文件大小的规则:

存储规则

service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read: if request.auth != null;
}
match /photos/{image} {
allow write: if request.resource.size < 3 * 1024 * 1024 && request.auth != null;
}
}
}

我遵循了这里的规则代码 https://firebase.google.com/docs/storage/security/start

我已经能够上传超过 5mb 的文件。 Firebase 存储报告文件大小为 5.33mb,超过了假定的 3mb 限制。

为了检查规则是否被识别(我有正确的路径结构),我将其更改为仅允许名称超过 3 个字符的文件 - 我尝试上传名称更长的文件但它不允许这符合预期。

编辑

要上传到存储的当前应用端代码(非常基本的“困惑”设置!)。基本上我有一个返回到 onActivityResult 的图像文件选择器:

    private static final String PHOTO_URLS = "photo_links";
private static final String PHOTOS_DATA = "photos";

private FirebaseDatabase firebaseDatabase;
private DatabaseReference photosDatabaseReference;
private FirebaseStorage firebaseStorage;
private StorageReference storageReference;
private OnSuccessListener<UploadTask.TaskSnapshot> uploadSuccessListener;
private OnFailureListener uploadFailureListener;

@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

firebaseDatabase = FirebaseDatabase.getInstance();
photosDatabaseReference = firebaseDatabase.getReference().child(PHOTO_URLS);
firebaseStorage = FirebaseStorage.getInstance();
storageReference = firebaseStorage.getReference().child(PHOTOS_DATA);
uploadSuccessListener = taskSnapshot -> photosDatabaseReference.push().setValue(new PhotoEntry(taskSnapshot.getDownloadUrl().toString()));
uploadFailureListener = Exception::printStackTrace;
}

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode == RESULT_OK){
switch(requestCode){
case REQUEST_CODE_PHOTO:
uploadToFirebase(data.getData());
break;
case REQUEST_CODE_AUTH:
// stuff to handle Auth ...
default: break;
}
} else if (resultCode == RESULT_CANCELED) {
makeText(this, "Operation cancelled", LENGTH_SHORT).show();
if(requestCode == REQUEST_CODE_AUTH) finish();
}
}

private void uploadToFirebase(Uri imageUri) {
StorageReference reference = storageReference.child(imageUri.getLastPathSegment());
reference.putFile(imageUri).addOnSuccessListener(uploadSuccessListener).addOnFailureListener(uploadFailureListener);
}

@Override protected void onDestroy() {
super.onDestroy();
uploadSuccessListener = null;
uploadFailureListener = null;
}

我哪里错了?

最佳答案

根据 the docs , "如果多个规则匹配一个文件,则结果是所有规则评估结果的 OR。也就是说,如果文件匹配的任何规则评估为 true,则结果为 true。”

换句话说,您的两个规则是冲突的:一个允许在任何地方进行任何操作,只要请求经过身份验证即可;而另一个需要文件大小限制。不幸的是,由于上述原因,这意味着无论限制如何,都可以上传文件,因为规则有效地“覆盖”了您的更深层次的规则。

您可能希望规则看起来像:

service firebase.storage {
match /b/{bucket}/o {
match /anotherPath/{allSubPaths=**} {
// Only use named paths
allow write: if request.auth != null;
}
match /{allOtherPaths}/{allSubPaths=**} {
// Or explicitly call out the path you want to avoid in the condition
allow write: if allOtherPaths!= "photos" && request.auth != null;
}
match /photos/{image} {
allow write: if request.resource.size < 3 * 1024 * 1024 && request.auth != null;
}
}
}

关于android - Firebase 存储规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42894138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com