Firebase规则限制version子节点写入失效,规则操场未识别子节点规则
Firebase Realtime Database 规则不生效问题解决办法
你碰到的核心问题是Firebase安全规则的叠加评估逻辑——规则不是子节点覆盖父节点,而是只要有任何一条规则允许操作,整个操作就会被允许。你当前的全局.write: true直接开了所有节点的写入权限,所以哪怕version节点设置了.write: false,这条限制也会被全局规则覆盖,完全起不到作用。
为什么会这样?
Firebase的规则是从上到下逐层评估的,父节点的权限会传递给子节点。如果父节点已经允许写入,子节点的禁止规则根本不会被触发——因为系统已经找到一条允许的规则了。
正确的规则写法
要实现「允许大部分节点写入,但禁止version节点编辑」的需求,你需要先全局禁止写入,再给需要开放的节点单独开权限,比如:
{ "rules": { ".read": true, // 全局默认关闭写入权限 ".write": false, // 给所有非version的节点开放写入(用通配符$other匹配任意节点) "$other": { ".write": true }, // 明确禁止version节点的写入 "version": { ".write": false } } }
如果你的数据库节点是明确的(比如只有data、config这些节点需要写入),更推荐精准配置,避免通配符带来的潜在风险:
{ "rules": { ".read": true, ".write": false, "data": { ".write": true }, "config": { ".write": true }, "version": { ".write": false } } }
测试小技巧
在规则操场测试时,一定要精准选择测试路径为/version,然后发起写入请求,就能看到规则正确拦截了。如果还是有问题,检查一下是不是路径写错了(比如version是不是嵌套在其他节点下,那规则里的路径也要对应调整)。
内容的提问来源于stack exchange,提问作者Mago
相关产品推荐
相关产品推荐

