如何配置安全规则:允许指定字段修改与新增字段,保护src不可变
解决方案:调整安全规则以允许新增字段并保护src字段不可变
现有规则的问题在于hasOnly(['gender','unit'])会严格限制所有被修改/新增的字段只能是这两个,导致无法添加extras这类新字段。要实现需求,需要拆分规则为两个核心逻辑:
规则调整思路
- 禁止修改src字段:确保更新操作中src的值与原数据完全一致;创建操作时默认允许设置src(若需禁止创建时设置可调整逻辑)。
- 允许合法字段修改与新增:允许修改gender、unit,同时允许添加原数据中不存在的新字段(如extras)。
修改后的规则代码
// 组合规则:src不可变 + 允许指定字段修改/新增字段 && (!resource.data.exists() || request.resource.data.get('src') === resource.data.get('src')) && request.resource.data.diff(resource.data).affectedKeys().every(key => ['gender', 'unit'].includes(key) || !resource.data.has(key) )
代码解释
- src字段保护逻辑:
!resource.data.exists()判断是否为创建操作(此时原数据不存在,允许设置src);如果是更新操作,则强制要求新数据的src与原数据完全一致,杜绝修改。 - 合法字段校验逻辑:遍历所有被改动的字段(包括新增字段),只要字段是gender/unit,或是原数据中没有的新字段,就符合规则。这样既保留了对指定基础字段的修改权限,又放开了新增字段的限制。
可选调整:创建时也禁止设置src
如果需要连创建时都不允许设置src字段,可将第一部分规则修改为:
&& !request.resource.data.has('src')
内容的提问来源于stack exchange,提问作者Richardson
相关产品推荐
相关产品推荐

