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

利用Firebase安全规则限制社交媒体应用的访问权限

Firebase Realtime Database 帖子权限与评分规则优化

针对你的两个核心需求,我们可以通过调整数据库规则来实现,先分析你原有规则的问题,再给出修正方案:

原有规则的问题

  1. posts节点的.write权限过于宽松,所有已认证用户都能修改/删除任意帖子,无法区分新增和修改操作。
  2. 评分验证部分错误使用了路径变量$score,它只是路径占位符,并非当前帖子的实际评分值,导致无法正确校验±1的修改逻辑。

修正后的规则实现

{
  "rules": {
    ".read": "auth.uid !== null",
    "posts": {
      "$postID": {
        ".write": "auth.uid !== null && (
          // 允许新增帖子:节点不存在,且提交数据包含当前用户的authorUid
          (!data.exists() && newData.exists() && newData.child('authorUid').val() === auth.uid) ||
          // 允许修改评分:仅提交score字段,且原节点存在
          (data.exists() && newData.exists() && newData.hasChildren(['score']) && !newData.hasChildren(['title', 'content']))
        )",
        // 评分只能在原基础上加1或减1
        "score": {
          ".validate": "newData.isNumber() && 
            (newData.val() === data.val() + 1 || newData.val() === data.val() - 1)"
        },
        // 帖子标题仅能在新增时设置,后续不可修改
        "title": {
          ".validate": "!data.exists() || newData.val() === data.val()"
        },
        // 帖子内容仅能在新增时设置,后续不可修改
        "content": {
          ".validate": "!data.exists() || newData.val() === data.val()"
        },
        // 作者ID仅在新增时绑定当前用户,不可变更
        "authorUid": {
          ".validate": "!data.exists() && newData.val() === auth.uid"
        }
      }
    }
  }
}

规则说明

  1. 新增帖子限制

    • 仅允许已认证用户创建新帖子,且必须携带authorUid字段(值为当前用户的UID),确保每个帖子的作者可追溯。
    • 新增后无法修改帖子的title、content、authorUid字段,彻底禁止修改现有帖子内容。
  2. 评分修改限制

    • 仅允许对现有帖子的score字段进行修改,且修改时不能同时提交其他字段(如标题、内容)。
    • 评分只能在原有基础上加1(点赞)或减1(点踩),非法的评分修改(如直接设置为100)会被规则拦截。
  3. 禁止删除操作

    • 通过newData.exists()确保所有写操作都不能删除帖子或字段,避免误删数据。

注意事项

  • 发帖时必须在请求数据中包含authorUid: auth.currentUser.uid,否则会被规则拒绝。
  • 修改评分时,需单独更新score字段(比如使用update()方法只传score键值对),不能同时修改其他字段。

内容的提问来源于stack exchange,提问作者Adam Ashkenazy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 20:45:26