Firestore规则配置:如何仅允许访问数组映射中的name字段?
Firestore规则配置:仅允许访问数组映射中的'name'字段
你之前使用的request.resource.data.diff(resource.data).affectedKeys().hasOnly(['Devices'])只能检测顶层字段的修改,无法管控数组内部的嵌套字段。要实现仅允许访问数组映射里的name字段,需要针对数组的每个元素做校验,以下是具体规则写法:
更新文档:仅允许修改Devices数组元素的'name'字段
match /你的集合名称/{docId} { allow update: if // 确保只有顶层的Devices字段被修改 request.resource.data.diff(resource.data).affectedKeys().hasOnly(['Devices']) && // 遍历校验Devices数组的每个元素 request.resource.data.Devices.every((newDevice, index) => { // 处理已有元素:要么未修改,要么仅修改了name字段 if (index < resource.data.Devices.size()) { const oldDevice = resource.data.Devices[index]; return newDevice == oldDevice || (newDevice.diff(oldDevice).affectedKeys().hasOnly(['name']) && newDevice.name is string); // 可选:校验name为字符串类型 } // 处理新增元素:只能包含name字段 else { return newDevice.keys().hasOnly(['name']) && newDevice.name is string; // 可选:校验name为字符串类型 } }); }
创建文档:仅允许Devices数组元素包含'name'字段
如果是新建文档,需要确保Devices数组的每个元素都只有name字段:
match /你的集合名称/{docId} { allow create: if request.resource.data.Devices.every((device) => { return device.keys().hasOnly(['name']) && device.name is string; // 可选:校验name为字符串类型 }); }
注意事项
- 将代码中的
你的集合名称替换为你实际使用的Firestore集合名称。 - 类型校验(
newDevice.name is string)是可选的,可根据业务需求添加,用于避免非法数据写入。 - Firestore不支持通过规则限制客户端仅读取文档的部分字段(读取操作是整文档级别的),如果需要限制前端仅获取
name字段,建议通过Cloud Function封装数据返回,或者在前端业务逻辑中过滤字段。
内容的提问来源于stack exchange,提问作者Vladimir K
相关产品推荐
相关产品推荐

