You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase Firestore 文档数组内嵌map场景的安全规则编写问题

Firestore 数组内嵌Map结构安全规则编写方案

Firebase Firestore安全规则中针对数组内嵌Map的校验,可通过List类型自带的all()方法遍历数组元素,再对每个元素的Map字段做类型、值域校验即可。

基础校验示例

假设你的文档结构如下:

文档字段名task_list为数组类型,每个数组元素是Map,包含3个必填字段:

  • task_id:字符串类型
  • completed:布尔类型
  • create_time:时间戳类型

对应的写入校验规则如下:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /your_collection/{doc_id} {
      allow write: if request.resource.data.task_list is list
        // 遍历数组内所有元素,校验每个Map的结构
        && request.resource.data.task_list.all(item, 
          item is map
          && item.keys().hasAll(['task_id', 'completed', 'create_time'])
          && item.task_id is string
          && item.completed is bool
          && item.create_time is timestamp
          // 可额外加值域校验,比如task_id长度不能超过20
          && item.task_id.size() <= 20
        );
    }
  }
}

常用场景扩展

场景1:仅允许新增数组元素,禁止修改/删除已有元素

allow write: if resource.data.task_list.size() <= request.resource.data.task_list.size()
  // 前N个元素和原有数组完全一致,N为原数组长度
  && request.resource.data.task_list[0:resource.data.task_list.size()].equals(resource.data.task_list)
  // 新增的元素符合Map结构要求
  && request.resource.data.task_list[resource.data.task_list.size():].all(item,
    item is map
    && item.keys().hasAll(['task_id', 'completed', 'create_time'])
    && item.task_id is string
    && item.completed == false // 新增的任务默认未完成
  );

场景2:仅允许操作自己所属的Map元素

如果每个Map内包含uid字段标识所属用户,要求用户只能修改自己对应的元素:

allow write: if request.resource.data.task_list.all(item,
  item.uid == request.auth.uid // 所有元素的uid只能是当前登录用户的uid
  || item.equals(resource.data.task_list[resource.data.task_list.indexOf(item)])
  // 非自己的元素不允许修改
);

注意事项

  • 安全规则中数组遍历的最大次数为1000次,如果你的数组长度可能超过1000,建议将数组结构改为子集合存储,避免规则校验失败。
  • 如果你需要对嵌套更深的Map(比如Map内再嵌套Map/数组)做校验,可直接用链式访问的方式读取字段,比如item.extra_info.address is string即可。

内容的提问来源于stack exchange,提问作者Noobdeveloper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 18:36:03