Firestore安全规则中的List索引是0-based还是1-based?
Firestore 安全规则 List 类型未公开说明整理
以下是官方文档未明确标注的 List 类型核心特性与用法:
- 全等匹配无需逐元素校验:可以直接使用
==运算符判断两个 List 内容是否完全一致,比如request.resource.data.tags == ["public", "readonly"]可直接校验数组内容完全符合预期 - 嵌套数组的匹配逻辑:
hasAll()、hasAny()、hasOnly()三个成员方法天然支持嵌套数组元素匹配,只要对应层级的元素类型和值完全一致即可命中规则 - 索引越界无报错:访问超出 List 长度的索引时会直接返回
null,不会触发规则执行中断,你可以直接通过request.resource.data.myList[5] == null来判断 List 长度是否小于6 - 空 List 类型校验规则:
xxx is list的类型校验对空 List 同样返回true,不需要额外做非空判断后再校验类型 - 内置方法支持 Set 类型入参:上述三个匹配方法可以直接传入 Set 类型作为参数,不需要手动做类型转换,比如
request.resource.data.tags.hasAll(resource.data.allowTags.toSet())可正常执行 - 未公开的
join方法:List 内置了官方未提及的join()方法,支持传入分隔符将 List 拼接为字符串,比如request.resource.data.userIds.join("|") == "1001|1002"可以作为特殊场景的匹配方式
注意:所有 List 内置方法传入非 List/Set 类型参数时,会直接返回
false而非抛出执行异常,规则匹配不生效时可优先排查入参类型是否符合要求
内容的提问来源于stack exchange,提问作者kr17
相关产品推荐
相关产品推荐

