我想知道是否有更简单的方法来实现这个规则。刚刚开始尝试 firestore。
match /emails/{emailId} {
allow write: if request.resource.data.attachments.size() == 0
|| request.resource.data.attachments.size() == 1 && request.resource.data.attachments[0].fileSize < 3 * 1024 * 1024 && (request.resource.data.attachments[0].filetype == 'image/png' || request.resource.data.attachments[0].filetype == 'image/jpg' || request.resource.data.attachments[0].filetype == 'application/vnd.ms-excel')
|| request.resource.data.attachments.size() == 2 && request.resource.data.attachments[0].fileSize < 3 * 1024 * 1024 && (request.resource.data.attachments[0].filetype == 'image/png' || request.resource.data.attachments[0].filetype == 'image/jpg' || request.resource.data.attachments[0].filetype == 'application/vnd.ms-excel') && request.resource.data.attachments[1].fileSize < 3 * 1024 * 1024 && (request.resource.data.attachments[1].filetype == 'image/png' || request.resource.data.attachments[1].filetype == 'image/jpg' || request.resource.data.attachments[1].filetype == 'application/vnd.ms-excel')
|| request.resource.data.attachments.size() == 3 && request.resource.data.attachments[0].fileSize < 3 * 1024 * 1024 && (request.resource.data.attachments[0].filetype == 'image/png' || request.resource.data.attachments[0].filetype == 'image/jpg' || request.resource.data.attachments[0].filetype == 'application/vnd.ms-excel') && request.resource.data.attachments[1].fileSize < 3 * 1024 * 1024 && (request.resource.data.attachments[1].filetype == 'image/png' || request.resource.data.attachments[1].filetype == 'image/jpg' || request.resource.data.attachments[1].filetype == 'application/vnd.ms-excel') && request.resource.data.attachments[2].fileSize < 3 * 1024 * 1024 && (request.resource.data.attachments[2].filetype == 'image/png' || request.resource.data.attachments[2].filetype == 'image/jpg' || request.resource.data.attachments[2].filetype == 'application/vnd.ms-excel')
|| request.resource.data.attachments.size() == 4 && request.resource.data.attachments[0].fileSize < 3 * 1024 * 1024 && (request.resource.data.attachments[0].filetype == 'image/png' || request.resource.data.attachments[0].filetype == 'image/jpg' || request.resource.data.attachments[0].filetype == 'application/vnd.ms-excel') && request.resource.data.attachments[1].fileSize < 3 * 1024 * 1024 && (request.resource.data.attachments[1].filetype == 'image/png' || request.resource.data.attachments[1].filetype == 'image/jpg' || request.resource.data.attachments[1].filetype == 'application/vnd.ms-excel') && request.resource.data.attachments[2].fileSize < 3 * 1024 * 1024 && (request.resource.data.attachments[2].filetype == 'image/png' || request.resource.data.attachments[2].filetype == 'image/jpg' || request.resource.data.attachments[2].filetype == 'application/vnd.ms-excel') && request.resource.data.attachments[3].fileSize < 3 * 1024 * 1024 && (request.resource.data.attachments[3].filetype == 'image/png' || request.resource.data.attachments[3].filetype == 'image/jpg' || request.resource.data.attachments[3].filetype == 'application/vnd.ms-excel');
}
我们不允许在规则中使用循环构造,因为我们依赖于多种优化技术,而这些技术对于更复杂的结构来说会更加困难。我们也不收取规则执行的计算时间,这意味着我们不希望它们变得太复杂并且可能被滥用。
由于规则中的重复,我强烈鼓励使用 function() 功能来简化。例如,这是
match /emails/{emailId} {
function attachments (){
return request.resource.data.attachments();
}
function attach_cnt () {
return attachments().size();
}
function valid_size(attach) {
return attachments()[attach].fileSize < 3 * 1024 * 1024;
}
function valid_type(attach) {
return (attachments()[attach].filetype == 'image/png'
|| attachments()[attach].filetype == 'image/jpg'
|| attachments()[attach].filetype == 'application/vnd.ms-excel');
}
allow write: (attach_cnt() < 1 || (valid_size(0) && valid_type(0)))
&& (attach_cnt() < 2 || (valid_size(1) && valid_type(1)))
&& (attach_cnt() < 3 || (valid_size(2) && valid_type(2)))
&& (attach_cnt() < 4 || (valid_size(3) && valid_type(3)))
}
这是我如何简化它的(值得仔细检查,因为我可能输入错误)。
- 我做了一个函数
attachments
对于正在访问的请求数据,因为它使用了一堆 - 这使得浏览规则变得很容易。
- 我做了一个函数
attach_cnt
因为已经检查了很多附件的数量。
- 现在我看到每个附件都有文件大小限制,所以我做了一个函数
valid_size
对于该测试,使用参数attach
我可以通过它。
- 接下来是功能
valid_type
其工作方式相同,但进行了检查以确保它是有效的类型。
- 现在很明显,对于具有 2-4 个项目等的请求,对附件 0 执行相同的检查。重新排序一些逻辑使您只需检查每个附件一次。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)