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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 06:17:53