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

Firebase Realtime Database如何设置规则禁止非所有者复制他人帖子

问题根因

  1. 现有数据库规则配置错误:
    • 根路径配置了全局.write: "auth != null",Firebase安全规则权限是向下继承的,父节点允许写入的情况下,子节点的限制规则不会生效
    • 规则中配置的posts路径和业务代码实际使用的Users/Posts存储路径不一致,针对帖子的权限限制完全没有生效
  2. 业务代码逻辑错误:
    • 更新帖子时固定使用当前登录用户的uid作为父路径,编辑他人帖子时会直接在自己的uid路径下写入对应postKey的内容,Firebase对不存在的路径执行update操作时会自动创建节点,就出现了副本帖子

修复方案

第一步:修正数据库安全规则

删除全局写入权限,对齐实际存储路径配置权限,最小化权限范围:

{
  "rules": {
    ".read": true,
    "Users": {
      "Posts": {
        "$uid": {
          // 仅对应uid的用户可以操作自己名下的帖子节点
          ".write": "auth != null && auth.uid == $uid",
          "$postId": {
            // 可选:增加字段校验,避免写入不符合格式的帖子数据
            ".validate": "newData.hasChildren(['title', 'content'])"
          }
        }
      }
    }
  }
}

配置后只有用户自己的uid路径下允许写入,非所有者无法在任何路径下违规创建帖子副本。

第二步:修正业务代码逻辑

  1. 存储帖子数据时需要额外保存帖子所属的作者uid字段,编辑前先判断当前登录用户id和帖子作者id是否一致,不一致直接隐藏/禁用编辑按钮,避免无效请求
  2. 编辑帖子时要使用帖子所属的作者uid作为父路径,而不是当前登录用户的uid,示例修改如下:
const updatePost = (e) => {
  e.preventDefault();
  // 新增判断:当前用户不是帖子作者直接拦截
  if (id !== props.farm.authorUid) {
    alert("你没有权限编辑他人帖子");
    return;
  }
  const obj = {
    ...values,
  };
  const postKey = props.farm.postKey;
  // 取帖子关联的作者uid作为父路径
  const authorUid = props.farm.authorUid;
  getFirebase()
    .database()
    .ref(`Users/Posts/`)
    .child(`${authorUid}`)
    .child(`${postKey}`)
    .update(obj, (err) => {
      if (err) console.log(err);
    });
};

删除逻辑也需要增加同样的作者权限判断,避免越权操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:27:00