Firestore评论添加问题:数组转Map后仍无法限制重复评论
Firestore限制用户重复提交评论的解决方案
核心需求
你已经把评论存储从数组改成了以用户ID为Key的Map结构,现在需要在Firestore安全规则里实现:每个用户只能给单个商品提交一条评论,重复提交直接拒绝。
规则修改方案
关键是利用Firestore规则里的resource.data(修改前的文档数据)来检查当前用户是否已经在该商品的评论Map中存在记录。以下是完整的规则代码:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /items/{itemId} { allow read: if true; allow write: if request.auth != null // 限制只能操作自己的评论字段 && request.resource.data.reviews.keys().hasOnly([request.auth.uid]) // 验证评论内容格式 && request.resource.data.reviews[request.auth.uid].rating is int && request.resource.data.reviews[request.auth.uid].rating >= 1 && request.resource.data.reviews[request.auth.uid].rating <= 5 && request.resource.data.reviews[request.auth.uid].review is string && request.resource.data.reviews[request.auth.uid].userName is string // 核心判断:要么还没reviews字段(首次提交),要么用户还没提交过评论 && (!resource.data.keys().has('reviews') || !(request.auth.uid in resource.data.reviews.keys())); } } }
规则细节解释
request.resource.data.reviews.keys().hasOnly([request.auth.uid]):防止用户篡改他人的评论,确保请求只涉及自己的评论Key。!resource.data.keys().has('reviews'):处理商品还没有任何评论的情况,允许首次创建reviews字段并添加评论。!(request.auth.uid in resource.data.reviews.keys()):如果已经有reviews字段,就检查当前用户ID是否已经存在于评论Map的Key中,存在则拒绝写入。
额外说明
如果之后需要允许用户修改自己已有的评论,只需要去掉上述规则里的!(request.auth.uid in resource.data.reviews.keys())部分即可。当前的客户端handleSubmit代码不需要做任何改动,它已经正确地以用户ID为Key存储评论。
内容的提问来源于stack exchange,提问作者Alexander_M
相关产品推荐
相关产品推荐

