Firestore文档特定Key写入权限配置——点赞/点踩系统场景
Firestore点赞/点踩系统实现与安全规则配置
你的这个数据结构思路很靠谱啊——用项目ID作为votes集合的文档ID,再以用户UID为键存储对应的投票值,不管是查某个项目的总投票数,还是判断特定用户有没有投过票,都能高效实现。
针对你要限制用户只能修改自己投票的需求,我给你写了对应的Firestore安全规则,直接用就行:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /votes/{votedDocId} { // 允许公开读取投票记录,要是需要仅限登录用户查看,改成request.auth != null就行 allow read: if true; // 核心写入规则:确保用户只能操作自己的投票字段 allow write: if // 限制每次只修改一个字段,防止批量篡改 request.resource.data.size() == 1 // 保证操作的字段是当前用户的UID && request.auth.uid in request.resource.data // 限制投票值为数字(比如1=点赞,-1=点踩) && request.resource.data[request.auth.uid] is number; } } }
规则细节说明:
request.resource.data.size() == 1:避免用户一次提交多个字段的修改,防止误操作或者恶意批量改动request.auth.uid in request.resource.data:确保用户只能创建或修改以自己UID命名的键,完全隔绝了操作他人投票的可能request.resource.data[request.auth.uid] is number:约束投票值的类型,如果你想更严格,比如只能是1或-1,可以把这条改成request.resource.data[request.auth.uid] in [1, -1]
另外补充两点实用建议:
- 这个规则默认允许用户修改自己的投票(比如从点赞改成点踩),要是你想禁止修改、只能投一次,可以额外加逻辑判断原始文档里是否已经存在该用户的UID
- 读取规则如果不需要公开,记得改成
request.auth != null,只允许登录用户查看投票数据
内容的提问来源于stack exchange,提问作者seanEd
相关产品推荐
相关产品推荐

