You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase实时数据库规则配置:禁止特定子节点写入权限

Firebase实时数据库规则:限制特定子节点写入的简洁方案

原规则为什么不生效?

你最初写的规则问题出在$userID层级的.write条件上:

"$userID": {".write": "auth.uid == $userID && !newData.hasChild('Post')" }

这里的newData指的是整个$userID节点操作后的完整数据,不是你正在修改的单个子节点。举个例子:

  • 如果用户已经有Post节点了,newData.hasChild('Post')会返回true,!newData.hasChild('Post')就变成false,直接导致所有对$userID下节点的写入(包括Name)都被拒绝。
  • 就算用户还没创建Post,这个规则也会限制你不能同时写入Name和Post,但这根本不是你要的效果——你只是想禁止写Post,其他节点随便写。

更简洁的规则写法

不用挨个给子节点写规则,利用Firebase规则的优先级特性(更具体的路径规则会覆盖父级通用规则),可以这么写:

{
  "rules": {
    "Users": {
      ".read": "auth != null",
      "$userID": {
        // 默认允许当前认证用户写入自己的节点下所有内容
        ".write": "auth.uid == $userID",
        // 单独给Post节点设置禁止写入,这个规则会覆盖上面的默认规则
        "Post": {
          ".write": false
        }
      }
    }
  }
}

或者用通配符的方式,明确允许除Post外的所有子节点:

{
  "rules": {
    "Users": {
      ".read": "auth != null",
      "$userID": {
        "$child": {
          ".write": "auth.uid == $userID && $child != 'Post'"
        },
        "Post": {
          ".write": false
        }
      }
    }
  }
}

这两种写法都能实现你的需求:已认证用户可以读写Name(以及其他子节点),但完全不能写入Post节点。而且不管你后续加多少个子节点,都不用修改规则,非常省心。

内容的提问来源于stack exchange,提问作者Sadman Rizwan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:34:04