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
相关产品推荐
相关产品推荐

