如何使用 firestore 的安全规则验证数组值?

2023-12-26

我有一个创建以下 JSON 结构的表单。

{  
   "reviewed":false,
   "title":"Just a title",
   "user":"UYV9TRKXfNW1NeCyFyfjZfagJ8B",
   "items":[  
      {  
         "age":"33",
         "experience":"Newcomer",
         "image":"https://image-url",
         "job":"Nerd",
         "name":"Testname",
         "party":"AAA",
         "type":"person"
      },
      {  
         "age":"33",
         "experience":"Newcomer",
         "image":"https://image-url",
         "job":"Informatiker",
         "name":"Testname",
         "party":"AAA",
         "type":"person"
      }
   ]
}

如何使用 firestore 的安全规则检查“items”的值?有没有办法循环/迭代数组?


为了完整起见:这是我到目前为止的解决方案。我按照链接答案中描述的方式做到了。可能的项目数量限制为 10,因此我们可以不用动态循环。

service cloud.firestore {
  match /databases/{database}/documents {
    match /events/{event} {

      function isAuthed() {
        return request.auth.uid != null
            && request.auth.uid == request.resource.data.user
            && request.auth.token.email_verified == true;
      }

      function isReviewed() {
        return request.resource.data.reviewed == false
            || request.resource.data.reviewed == "false"
      }

      function isValidTitle() {
        return isValidStringInput(request.resource.data.title, 200);
      }

      function items() {
        return request.resource.data.items;
      }

      function isValidPerson(item) {
        return items()[item].keys().hasAll(['image','type','name','job','age','party','experience'])
                && isValidStringInput(items()[item].image, 100)
                && isValidStringInput(items()[item].type, 10)
                && isValidStringInput(items()[item].name, 50)
                && isValidStringInput(items()[item].job, 50)
                && isValidStringInput(items()[item].party, 50)
                && isValidStringInput(items()[item].experience, 50)
                && isValidNumber(items()[item].age);
      }

      function isValidParty(item) {
        return items()[item].keys().hasAll(['image','type','name','orientation','experience','promi'])
                && isValidStringInput(items()[item].image, 100)
                && isValidStringInput(items()[item].type, 10)
                && isValidStringInput(items()[item].name, 50)
                && isValidStringInput(items()[item].orientation, 50)
                && isValidStringInput(items()[item].experience, 50)
                && isValidStringInput(items()[item].promi, 50);
      }

      function isValidItem(item) {
        return isValidPerson(item)
            || isValidParty(item);
      }

      function isValidStringInput(input, maxSize) {
        return input is string
            && input.size() > 0
            && input.size() <= maxSize;
      }

      function isValidNumber(input) {
        return input is int
            || input.matches('^[0-9]+$');
      }

        // One can READ
            // always ...
        allow read: if true;

      // One can WRITE, when ...
        // writer is logged in
        // uid in event is same as uid of writer
        // writer has email confirmed
        // reviewed is initial set to false
        // form/user input is ok
      allow write, update:
        if isAuthed()
        && isReviewed()
        && isValidTitle()
        && items().size() >= 1
        && items().size() <= 10
        && isValidItem(0)
        && (items().size() < 2 || isValidItem(1))
        && (items().size() < 3 || isValidItem(2))
        && (items().size() < 4 || isValidItem(3))
        && (items().size() < 5 || isValidItem(4))
        && (items().size() < 6 || isValidItem(5))
        && (items().size() < 7 || isValidItem(6))
        && (items().size() < 8 || isValidItem(7))
        && (items().size() < 9 || isValidItem(8))
        && (items().size() < 10 || isValidItem(9));
    }
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 firestore 的安全规则验证数组值? 的相关文章

随机推荐

  • Windows 命令行 (cmd.exe) 命令的最大长度是多少?

    有很多人问问题 https stackoverflow com questions 1277565 cmd exe command line string limits关于如何解决 cmd exe 命令最大长度的问题 我想知道 Window
  • div 中的画布与显示无不起作用

    我遇到了画布元素的问题 当它位于隐藏的 div 中并且 div 被切换时 它不会显示 更好的解释和例子在这里 http jsfiddle net 78sJT 10 http jsfiddle net 78sJT 10 这发生在 ff 和 c
  • 使用 XMLELEMENT Oracle 时如何替换 ' 或任何特殊字符

    我有以下查询 如何保留撇号 完好无损并且没有将其替换为 apos我也想处理其他角色 SELECT RTRIM XMLAGG XMLELEMENT E I m EXTRACT text FROM dual Output I apos m Th
  • 从 PHP 中的 CIDR 表示法获取列表 IP

    有没有办法 或函数 类 从 CIDR 表示法获取 IP 地址列表 例如 我有 73 35 143 32 27 CIDR 并且想要获取此表示法中的所有 IP 的列表 有什么建议么 谢谢 我将编辑前述 https stackoverflow c
  • 在触摸 MapView 之前视图不会更新

    我有一个主要由一个大地图视图组成的活动 在该 MapView 之上 我还有一些其他视图正在尝试以编程方式与之交互 当我尝试使用 AnimationListener 对 MapView 顶部的其中一个视图进行动画处理时 出现了第一个问题 在我
  • 远程发起人停止被调用

    我有一个应用程序 它在单个进程中创建多个应用程序域 并通过远程处理在它们之间进行通信 我为所有对象创建赞助商以防止它们被垃圾回收 但是 无论如何 有些人最终还是获得了GCed 经过一番调查后 我确定取决于InitialLeaseTime在我
  • 使用 Moment 的guess() 返回时区名称

    我想用时刻的guess 函数 https momentjs com timezone docs using timezones guessing user timezone 返回时区大陆 或国家 和城市 如示例所示 moment tz gu
  • Spring JPA 中跨两个不同数据库表的查询

    我有三张桌子 表1在DB1中 表2和表3都在DB2中 如下所述 DB1中的表1 customerId accountNumber DB2 中的表 2 customerId accountNumber id DB2 中的表 3 id 名称 国
  • 区分音乐文件中的乐器[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定一个音乐文件 是否可以分离出正在演奏的每种乐器 IE 假设我有一些Song mp3 那首歌中有人声 吉他 贝斯和鼓 我想要 4 个
  • 确定 Javascript 对象是“复杂”对象还是只是一个字符串

    我希望能够传递字符串文字 this is a string 或 JavaScript 对象 one this two is three a four string 作为函数的参数 并根据它是字符串还是对象采取不同的操作 我如何确定哪个是真的
  • LINQ to SQL 使用不同的行对多个列进行分组

    我有以下表结构 我想选择不同的CustomerId and CustomerName TotalCost 这是表结构和列数据类型 LogId int CustomerId string CustomerName string Cost in
  • SVG 线端点独立动画

    我正在尝试对 SVG 线端点之一进行动画处理 使其沿着特定路径移动 而另一个端点保持静止 因此线会拉伸和收缩 同时保持笔直 到目前为止 我所实现的目标是使我的整条线沿着路径移动 并将端点之一绑定到它
  • Android 问答游戏 - 每个问题的倒计时器

    我使用此处的教程创建了一个适用于 Android 的测验应用程序 http automateddeveloper blogspot co uk 2011 06 getting started complete android app htm
  • 如何停止 html 属性中 onclick 事件的事件传播?

    我有一个带有 onclick 属性的 html 元素 我需要防止该事件冒泡 我尝试这样做 div 和这个 div 但两者都不起作用 我绝对需要在 html onclick 属性中执行此操作 因为此 div 是 Razor 部分视图的一部分
  • 如何在 Mac 10.7 上的 virtualenv 中安装 MatPlotLib

    这是我尝试做的 SAASSenv miki725mac SAASSenv miki725 python Python 2 7 2 v2 7 2 8527427914a2 Jun 11 2011 15 22 34 GCC 4 2 1 Appl
  • c 编程难题

    给定一个所有元素均为正数的数组 求子序列的最大和 约束条件是序列中的 2 个数字不应在数组中相邻 因此 3 2 7 10 应返回 13 3 和 10 之和 或 3 2 5 10 7 应返回 15 3 5 和 7 之和 我尝试使用所有可能允许
  • NPM 搜索:内存不足

    在 ubuntu 14 10 3 13 0 76 generic 120 Ubuntu SMP Mon Jan 18 15 59 10 UTC 2016 x86 64 x86 64 x86 64 GNU Linux 上 当我这样做时 sud
  • 实现 AsyncTask 的技巧

    大家好 我有一个应用程序 可以在位图上放置一个圆圈 并使用滑动条更改圆圈内像素的 RGB 值 我想使用 asynctask 来加速更改像素的过程 我不知道从哪里开始 我在活动文件底部注释掉了一些代码 因为这是我第一次尝试 谁能指出我如何实现
  • 使用 OpenCV 进行头部(和肩部)检测

    如果我问了一个太新手的问题 请提前道歉 我是 OpenCV 的初学者 我已经完成了一些教程 但我还没有很好地掌握它的概念 问题 如何使用 OpenCV 进行头部检测 不是面部检测 例如在公共汽车或房间内的照片中 注意 我不想做人脸检测 只需
  • 如何使用 firestore 的安全规则验证数组值?

    我有一个创建以下 JSON 结构的表单 reviewed false title Just a title user UYV9TRKXfNW1NeCyFyfjZfagJ8B items age 33 experience Newcomer