Firebase实时数据库含ChildByAutoID的people节点安全规则编写咨询
解决带自动生成Key的Firebase点赞安全规则问题
嘿,我来帮你搞定这个Firebase实时数据库的安全规则问题!先理清楚你的数据结构,再一步步拆解规则怎么写。
首先,你的现有数据结构是这样的(用代码块更清晰):
"people" : { "user uid" : { "Domain" : "aol.com", "peopleWhoLike": { "-M-vZavBdcpX3SzkvgKN" : "IrrBgFY9C1ekMmHUkQRzc5LhbDu1" // 自动生成的Key作为键,值是点赞者的UID } } }
你需要的是针对带自动生成Key的peopleWhoLike节点编写规则,核心是匹配动态的自动Key、确保用户只能给自己点赞、且点赞者和被点赞者域名一致。这里关键是用Firebase规则的通配符变量($开头)来指代那个自动生成的Key,比如叫$autoLikeKey就行,名字可以自定义,只要符合规则。
对应的安全规则写法
{ "rules": { "people": { "$targetUid": { // 被点赞者的UID "peopleWhoLike": { "$autoLikeKey": { // 指代ChildByAutoID生成的自动Key ".read": "auth.uid != null", // 登录用户可读取点赞列表 ".write": "auth.uid != null && newData.val() == auth.uid && root.child('people').child($targetUid).child('Domain').val() == root.child('people').child(newData.val()).child('Domain').val()" } } } } } }
规则细节解释
我把.write规则拆成几个部分,方便你理解:
auth.uid != null:确保操作的用户是已登录状态newData.val() == auth.uid:保证写入的点赞记录值是当前用户自己的UID(也就是用户只能给自己点赞,不能替别人点)- 最后两行是域名匹配检查:
root.child('people').child($targetUid).child('Domain').val():获取被点赞者的域名($targetUid就是被点赞用户的UID节点)root.child('people').child(newData.val()).child('Domain').val():获取点赞者的域名(newData.val()是当前用户的UID,也就是点赞者)- 两者相等才允许写入,确保同域名用户才能互相点赞
另外,如果你想限制用户只能添加一次点赞(不能重复点),还可以加个!data.exists()的条件,也就是只有当这个自动Key对应的记录不存在时才能写入,避免重复提交。
内容的提问来源于stack exchange,提问作者frank timmon
相关产品推荐
相关产品推荐

