如何编写Firebase安全规则函数,限制嵌套对象大小并满足合规要求
Firebase Firestore安全规则:嵌套数据结构大小约束实现
需求概述
需通过安全规则强制执行以下嵌套数据的层级大小限制:
- 根级对象最多包含2个键
- 每个根级键对应的子对象最多包含12个键
- 所有子键对应的value必须是数组,且数组元素数量不超过7个
示例数据结构
// 符合约束的示例数据 data: { // 根级最多2个键 key1: { // 第二层最多12个键 subId1: [], // 数组最多7个元素 subId2: [], // ... 最多到subId12 }, key2: { /* 结构同key1 */ } }
完整安全规则实现
service cloud.firestore { match /databases/{database}/documents { match /yourCollection/{document} { // 读写权限依赖数据合法性校验 allow read, write: if isValidData(request.resource.data); // 核心校验函数 function isValidData(data) { // 1. 根级对象最多2个键 return data.size() <= 2 // 2. 遍历所有根级键,校验每个子对象的规则 && data.values().every(rootValue => // 子对象最多12个键 rootValue.size() <= 12 // 子对象的所有value必须是数组,且数组长度≤7 && rootValue.values().every(subValue => subValue is list && subValue.size() <= 7 ) ); } } } }
规则细节说明
- 根级约束:通过
data.size() <= 2限制根对象的键数量不超过2个。 - 第二层对象约束:使用
data.values().every(...)遍历所有根级值,通过rootValue.size() <= 12限制每个子对象的键数量。 - 数组约束:再次遍历第二层对象的所有值,通过
subValue is list确保类型为数组,同时subValue.size() <=7限制数组元素数量。
可选扩展:子键名称校验
如果需要限制第二层的键必须是subId1到subId12,可以在第二层校验中添加键名验证:
// 在rootValue的校验中加入 && rootValue.keys().hasOnly([ 'subId1', 'subId2', 'subId3', 'subId4', 'subId5', 'subId6', 'subId7', 'subId8', 'subId9', 'subId10', 'subId11', 'subId12' ])
内容的提问来源于stack exchange,提问作者Richardson
相关产品推荐
相关产品推荐

