Firebase Realtime Database如何设置规则禁止非所有者复制他人帖子
问题根因
- 现有数据库规则配置错误:
- 根路径配置了全局
.write: "auth != null",Firebase安全规则权限是向下继承的,父节点允许写入的情况下,子节点的限制规则不会生效 - 规则中配置的
posts路径和业务代码实际使用的Users/Posts存储路径不一致,针对帖子的权限限制完全没有生效
- 根路径配置了全局
- 业务代码逻辑错误:
- 更新帖子时固定使用当前登录用户的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路径下允许写入,非所有者无法在任何路径下违规创建帖子副本。
第二步:修正业务代码逻辑
- 存储帖子数据时需要额外保存帖子所属的作者uid字段,编辑前先判断当前登录用户id和帖子作者id是否一致,不一致直接隐藏/禁用编辑按钮,避免无效请求
- 编辑帖子时要使用帖子所属的作者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
相关产品推荐
相关产品推荐

