Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Firebase存储规则_Android_Firebase_Firebase Security_Firebase Storage - Fatal编程技术网

Android Firebase存储规则

Android Firebase存储规则,android,firebase,firebase-security,firebase-storage,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 writ

我是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;
    }
  }
}
哪里出了问题?

根据,“如果多个规则匹配一个文件,则结果是所有规则求值结果的
。也就是说,如果文件将求值与
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;
    }
  }
} 
service firebase.storage{
匹配/b/{bucket}/o{
匹配/anotherPath/{allsubpath=**}{
//仅使用命名路径
允许写入:if request.auth!=null;
}
匹配/{allOtherPaths}/{allSubPaths=**}{
//或者在条件中显式调用要避免的路径
允许写入:如果AllotherPath!=“photos”&&request.auth!=null;
}
匹配/照片/{image}{
允许写入:如果request.resource.size<3*1024*1024&&request.auth!=null;
}
}
} 

请发布上传文件的代码。@qbix您好,我添加了一些用于执行任务的相关代码-希望它能指出我的错误所在。我无法复制您的结果,但没有复制您代码的所有详细信息。可能在
uploadSuccessListener
中添加一条日志消息,输出
taskSnapshot.GetByTestTransferred()
,以确认上载文件的大小。@qbix Hi我想我已经解决了问题。。。从发布新规则到为个人用户实际执行的规则似乎不是即时的,即,如果设置了3mb规则,则可能允许在一段时间内或在用户注销和登录之前上传超过3mb的内容?我这样问是因为在我注销并再次登录后,上传时出现403错误(存储权限被取消),这意味着规则得到了正确遵守?其中包括:规则会立即上传到云存储服务器,但可能需要5分钟才能生效。对于我的测试,规则更改在几秒钟内可见。也许地理位置是一个因素;我在加利福尼亚。OP的规则只有一条关于
允许写入的规则。我不知道有什么规则在被修改。是否存在隐式
允许写入是否匹配/{allpath=**}
?我这样问是因为在我运行的测试中,OP的规则起了作用。如果文件大小超过限制,他们会拒绝写入。哇,完全忽略了那个细节。。。是的,如果它们属于同一类型(所有读取、写入等),则它们仅为
ed。我将尝试复制。嗨,谢谢你的帖子-正如@qbix指出的,我没有冲突-我一开始是这么做的,但很快意识到级联规则冲突,并更改为帖子中的代码,所以我不知所措-我已经更新了,包括上传文件的非常基本的代码。我的看法是,我对经过身份验证的用户进行了全局读取,但限制了在
/photos/
路径上的写入。
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;
    }
  }
}