利用Firebase安全规则限制社交媒体应用的访问权限
Firebase Realtime Database 帖子权限与评分规则优化
针对你的两个核心需求,我们可以通过调整数据库规则来实现,先分析你原有规则的问题,再给出修正方案:
原有规则的问题
posts节点的.write权限过于宽松,所有已认证用户都能修改/删除任意帖子,无法区分新增和修改操作。- 评分验证部分错误使用了路径变量
$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" } } } } }
规则说明
新增帖子限制
- 仅允许已认证用户创建新帖子,且必须携带
authorUid字段(值为当前用户的UID),确保每个帖子的作者可追溯。 - 新增后无法修改帖子的
title、content、authorUid字段,彻底禁止修改现有帖子内容。
- 仅允许已认证用户创建新帖子,且必须携带
评分修改限制
- 仅允许对现有帖子的
score字段进行修改,且修改时不能同时提交其他字段(如标题、内容)。 - 评分只能在原有基础上加1(点赞)或减1(点踩),非法的评分修改(如直接设置为100)会被规则拦截。
- 仅允许对现有帖子的
禁止删除操作
- 通过
newData.exists()确保所有写操作都不能删除帖子或字段,避免误删数据。
- 通过
注意事项
- 发帖时必须在请求数据中包含
authorUid: auth.currentUser.uid,否则会被规则拒绝。 - 修改评分时,需单独更新
score字段(比如使用update()方法只传score键值对),不能同时修改其他字段。
内容的提问来源于stack exchange,提问作者Adam Ashkenazy
相关产品推荐
相关产品推荐

