Firebase中限制mainsibbling与可变键slavesibbling节点的写入权限
Firebase关联节点写入权限设置方案
我来帮你搞定Firebase这两个关联节点的权限设置问题,结合你的数据结构和需求,咱们一步步梳理:
核心需求拆解
- 允许用户创建新的
mainsibblings和slavesibbling节点 - 禁止用户覆盖/修改已存在的
mainsibblings节点(如果需要禁止修改slavesibbling也可以调整) - 保证
slavesibbling节点和对应的mainsibblings节点关联有效(即onMainSibling的值必须是真实存在的mainsibblings条目ID)
安全规则示例
以下是满足需求的Firebase安全规则,我会逐段解释:
{ "rules": { "mainsibblings": { "$mainId": { // 仅允许创建新条目,禁止修改已有内容 ".write": "!data.exists() && newData.exists()", // 验证提交的数据结构:必须包含MACaddress字段,且为字符串类型 ".validate": "newData.hasChildren(['MACaddress']) && newData.child('MACaddress').isString()" } }, "slavesibbling": { "$macAddress": { // 允许创建新MAC条目,或更新已有条目,但必须保证关联的main节点存在 ".write": "newData.exists() && root.child('mainsibblings').child(newData.child('onMainSibling').val()).exists()", // 验证数据结构:必须包含onMainSibling字段,且对应main节点真实存在 ".validate": "newData.hasChildren(['onMainSibling']) && root.child('mainsibblings').child(newData.child('onMainSibling').val()).exists()" } } } }
规则细节说明
mainsibblings节点权限:
.write规则中的!data.exists()确保只有当该$mainId节点不存在时才能写入,也就是只能通过Firebase的push方法创建新条目,完全禁止修改或删除已有的mainsibblings内容。.validate规则限制了提交的数据只能包含MACaddress字符串字段,避免用户提交无关数据。
slavesibbling节点权限:
- 当前的
.write规则允许用户创建新的MAC条目,或者更新已有的条目,但前提是onMainSibling对应的mainsibblings节点必须存在,保证关联关系的有效性。 - 如果你想禁止更新slavesibbling的已有条目,只允许创建新的,把
.write规则改成下面这样即可:".write": "!data.exists() && newData.exists() && root.child('mainsibblings').child(newData.child('onMainSibling').val()).exists()"
- 当前的
这样设置后,既能满足用户创建关联节点的需求,又能有效防止不必要的覆盖操作,同时保证数据的关联性正确。
内容的提问来源于stack exchange,提问作者Joao Alves Marrucho
相关产品推荐
相关产品推荐

