firestore 规则中是否有循环?

2023-11-25

我想知道是否有更简单的方法来实现这个规则。刚刚开始尝试 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)))
}

这是我如何简化它的(值得仔细检查,因为我可能输入错误)。

  1. 我做了一个函数attachments对于正在访问的请求数据,因为它使用了一堆 - 这使得浏览规则变得很容易。
  2. 我做了一个函数attach_cnt因为已经检查了很多附件的数量。
  3. 现在我看到每个附件都有文件大小限制,所以我做了一个函数valid_size对于该测试,使用参数attach我可以通过它。
  4. 接下来是功能valid_type其工作方式相同,但进行了检查以确保它是有效的类型。
  5. 现在很明显,对于具有 2-4 个项目等的请求,对附件 0 执行相同的检查。重新排序一些逻辑使您只需检查每个附件一次。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

firestore 规则中是否有循环? 的相关文章

随机推荐

  • 未找到 OpenCV 非托管 DLL asp.net

    我们正在构建一个 Web 应用程序 C NET 它使用 Emgu opencv 包装器形式的非托管库 我们强制构建为 32 位 x86 并且我们使用 Emgu 的 32 位版本 所有这些在本地构建上都运行良好 但是当发布到我们的网络服务器时
  • 使用 C++ 和 Windows API 以编程方式更改壁纸

    我一直在尝试使用 Qt 和 mingw32 编写一个应用程序来下载图像并将其设置为背景壁纸 我在网上阅读了几篇关于如何在 VB 和 C 中执行此操作的文章 以及在某种程度上如何在 C 中执行此操作 我目前正在致电SystemParamete
  • 错误:无效的“asm”:在 GCC 中使用内联汇编时,% 字母后缺少操作数编号

    我正在尝试将 MS 的简单汇编代码转换为与 gcc 一起使用 我尝试转换的 MS 汇编代码就在下面 我有两个int变量 number and return mov eax number neg eax return eax 而且 我已经尝试
  • std::regex 线程安全吗?

    相关静态 boost wregex 实例是线程安全的吗 但对于标准化版本 我可以从具有相同正则表达式对象的多个线程调用 regex search 吗 声称std regex在各个方面都是线程安全的 这是一个相当大胆的声明 C 11 标准没有
  • 如何在Python中将RGB图像转换为灰度图像?

    我正在尝试使用matplotlib读取 RGB 图像并将其转换为灰度图像 在 matlab 中我使用这个 img rgb2gray imread image png In the matplotlib 教程他们不涵盖它 他们只是在图像中阅读
  • 如何在 Bootstrap 3 网格系统内分隔这些图像?

    我想知道使用 Bootstrap 3 RC2 使用 CSS 在这 3 个图像之间放置空格的最佳方法是什么 因为我目前所做的不是自动调整图像大小 即使我已将宽度设置为自动 pictureid 标签 我希望他们能够内联并相应地调整图像大小 这是
  • OpenSSL 和 MS CryptoAPI:不同的数字签名

    我使用 makecert 实用程序生成带有私钥的 X509 证书 makecert n CN RootCATest r sv RootCATest pvk RootCATest cer makecert sk MyKeyName iv Ro
  • 带有 proguard 的 Ksoap2

    我有一个使用 ksoap2 库的应用程序 一切正常 但是从 Eclipse 导出应用程序时 它显示了这个 Proguard returned with error code 1 See console Note there were 4 d
  • 保存图形后,图形标签和刻度后面的黑色背景,但不在交互视图中

    我有一个奇怪的问题 如果我保存一个图形 它的标签和刻度线将具有黑色背景 请参阅此示例 plt savefig asdsadsad png 我什至没有在此处包含任何代码 因为这种情况发生在最简单的绘图上 即使我之前使用另一台从未出现过此问题的
  • SQLAlchemy 列到行转换,反之亦然——这可能吗?

    我正在寻找一种仅 SQLAlchemy 的解决方案 用于将从表单提交收到的字典转换为数据库中的一系列行 每个行对应提交的每个字段 这是为了处理不同应用程序之间差异很大的首选项和设置 但是 它很可能适用于创建类似数据透视表的功能 我在 ETL
  • 停止在 PHP 中使用“global”

    我有一个config php包含在每个页面中 在配置中我创建了一个看起来像这样的数组 config array config site name Site Name config base path home docs public htm
  • 角度动态行跨度

    人数及其手机号码是动态的 我需要在表格中显示这一点 数据可以包含任意数量的用户名和手机号码 dataList pname abc numbers mobile1 123 mobile2 234 pname mno numbers mobil
  • Play/Java 应用程序中的依赖项 javaWs、javaJpa 等来自哪里?

    我正在使用 Java 在 Play Framework 中启动一个新项目 我检查了build sbt文件并且无法理解依赖项名称的来源 libraryDependencies Seq javaJdbc cache javaWs javaJpa
  • SimpleDateFormat:无法解析的日期异常

    在查看了几篇现有的帖子后 我仍然无法让我的 SimpleDateFormat 解析器正常工作 这是代码 SimpleDateFormat df new SimpleDateFormat EEE dd MMM yyyy HH mm ss Z
  • 如何在ARCore中显示PNG图像?

    我想在 Arcore 中显示 2d png 图像 我不想使用 obj smf imgdb 文件和 3D 图像 我已经引用了很多链接 但没有一个链接显示如何使用 Arcore 仅显示 2d png 图像 https github com go
  • Java:在小程序中将pdf文件从URL读取到字节数组/ByteBuffer中

    我试图找出为什么这个特定的代码片段对我不起作用 我有一个小程序 它应该读取 pdf 并使用 pdf 渲染器库显示它 但由于某种原因 当我读取服务器上的 pdf 文件时 它们最终被损坏 我已经通过再次写回文件来测试它 我尝试在 IE 和 Fi
  • PHP将csv列读入数组

    我有一个 php 函数可以让我将 csv 列 COLUMN NOT LINE 读取到数组或字符串中 先感谢您 csv array map str getcsv file data csv header array shift csv Sep
  • 使用 socket.gethostname 时,socket.getfqdn() 和 socket.gethostname() 给出不同的 IP 地址

    我正在运行一个虚拟机 它提供以下值以及运行代码的时间 通过在网站上执行一些操作 socket getfqdn x vps 01 abc it socket gethostname x vps 01 socket gethostbyname
  • 如果没有断言,pytest 会失败吗?

    今天我的测试失败了 但很高兴成功了 因为我忘记了最后一行相当重要的一行 assert actual expected 我希望机器将来能够发现这个错误 有没有办法让 pytest 检测测试函数是否未断言任何内容 并将其视为测试失败 当然 这需
  • firestore 规则中是否有循环?

    我想知道是否有更简单的方法来实现这个规则 刚刚开始尝试 firestore match emails emailId allow write if request resource data attachments size 0 reque