Firebase安全规则配置:仅允许用户修改自身嵌套点赞记录
解决Firebase点赞记录的权限控制问题
你的数据结构是upvotes/{itemId}/{userId},但规则里写的是/votes/{id},首先要修正路径匹配的一致性。
问题分析
- 第一种规则在
/votes/{id}层级设置了allow write: if request.auth != null,这意味着任何认证用户都能直接修改整个itemId节点下的所有数据,包括其他用户的点赞记录,不符合需求。 - 第二种规则没有在
/votes/{id}层级设置任何写权限,Firebase的规则默认拒绝所有操作,所以即使子节点有允许规则,顶层没有放行的话,操作会提示权限不足。
正确的权限规则
根据你的数据结构,分两种数据库类型给出对应规则:
若使用Firestore数据库
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 控制单个用户的点赞节点权限 match /upvotes/{itemId}/{uid} { allow read: if true; allow write: if request.auth != null && request.auth.uid == uid; } // 禁止直接修改整个item的点赞集合 match /upvotes/{itemId} { allow read: if true; allow write: if false; } } }
若使用实时数据库
{ "rules": { "upvotes": { "$itemId": { ".read": true, ".write": false, "$uid": { ".read": true, ".write": "auth != null && auth.uid === $uid" } } } } }
规则说明
- 路径匹配与你的数据结构完全对应,确保规则作用到正确节点。
- 单个用户的点赞节点
{uid}仅对该UID的认证用户开放写权限,保证用户只能修改自己的记录。 - 禁止直接操作整个
itemId节点,强制必须通过单个用户节点进行点赞/取消点赞操作。 - 保留所有读权限为开放状态,符合你之前的需求。
操作注意
确保代码中操作点赞时,是直接写入或删除upvotes/{itemId}/{当前用户UID}节点,而非操作整个itemId节点。
内容的提问来源于stack exchange,提问作者Austin
相关产品推荐
相关产品推荐

