android - Firebase 存储规则

标签 android firebase firebase-security firebase-storage

我是 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/

相关文章:

android - setLogo toolbar from url 图片

android - E/com.facebook.appevents.RestrictiveDataManager : updateRulesFromSetting failed

firebase - 使用 firebase 密码重置链接打开我的应用程序的特定屏幕

angularjs - 登录时如何处理状态(Ionic、Firebase、AngularJS)?

iOS:通过电子邮件的 Firebase 邀请不起作用

google-cloud-firestore - Firestore 安全规则 request.auth 始终为 null

firebase - 为什么在我测试更新或创建时,firebase 模拟器会抛出无效的参数错误?

android - 如何在Android Web View 中隐藏查找结果

java - 客户端(Java)未连接到服务器(Kotlin)Android Studio,出了什么问题?

javascript - 在 Firebase 上创建/添加用户