Firebase规则问题:仅子节点存在时允许setValue操作
解决Firebase规则:仅当指定子节点存在时允许写操作
我来帮你搞定这个Firebase规则的问题!你的核心需求很明确:只有当目标项的key子节点存在时,才允许修改check字段的值,避免项被删除后还写入无效数据。
先分析你之前规则的问题:
- 第一个规则里,
.write条件用了data.child('List')...,这里的data指的是当前要写入的check节点,所以这个路径完全不对,自然起不到限制作用。 - 第二个规则把检查放在了
.validate里,但.validate主要是校验新写入数据的格式,而你需要的是检查现有节点是否存在,而且你的.write只验证了登录状态,没把节点存在的条件加进去,所以还是会允许非法写入。
正确的规则配置
根据你的数据结构,我整理了生效的规则:
{ "rules": { "List": { "$listID": { "$key": { "check": { ".read": "auth.uid != null", ".write": "auth.uid != null && parent().child('key').exists()" } } } } } }
规则解释
auth.uid != null:保留了你原来的登录校验,确保只有登录用户才能操作。parent().child('key').exists():这里的parent()指的是当前check节点的父节点(也就是$key对应的项节点),这个条件会直接检查该节点下是否存在key子节点——只有当key存在时,才允许修改check的值。
额外说明
- 不管你是用
setValue修改check,还是用update操作,这个规则都会生效:如果目标项已经被删除(key节点不存在),写操作会被Firebase拒绝。 - 你可以用Firebase控制台的规则模拟器测试:分别模拟
key存在和不存在时的写请求,验证规则是否按预期拦截非法操作。
内容的提问来源于stack exchange,提问作者ImNeos
相关产品推荐
相关产品推荐

