Firebase安全规则配置:限制仅向Firestore的Recipes点赞数组添加自身UID
Firebase安全规则配置:限制仅能添加自身UID到Recipes的likes数组
我来帮你配置符合需求的Firebase安全规则,核心目标是确保用户只能把自己的UID添加到Recipes文档的likes数组里,无法操作其他用户的ID。下面是详细的规则方案和解释:
核心规则代码
首先,我们需要使用Firestore规则版本2(因为要用到数组对比的diff()方法),完整规则如下:
service cloud.firestore { match /databases/{database}/documents { // 基础规则:所有操作要求用户已认证 match /{document=**} { allow read, write: if request.auth != null; } // 针对Recipes集合的精细化规则 match /Recipes/{recipeId} { // 更新操作:仅允许添加/移除自身UID,禁止操作其他用户ID allow update: if // 确保likes字段始终是数组类型 request.resource.data.likes is list && // 计算likes数组的变更(新增/移除的元素) let likeChanges = request.resource.data.likes.diff(resource.data.likes); // 新增的元素只能是当前用户的UID likeChanges.added().hasOnly([request.auth.uid]) && // 移除的元素也只能是当前用户的UID(如果允许取消点赞的话保留这条,否则删除) likeChanges.removed().hasOnly([request.auth.uid]); // 创建文档规则:允许初始likes为空,或者仅包含当前用户UID(比如自己创建食谱时给自己点赞) allow create: if request.resource.data.likes is list && (request.resource.data.likes == [] || request.resource.data.likes == [request.auth.uid]); } } }
规则细节解释
规则版本2:必须声明
rules_version = '2';,因为diff()方法是版本2新增的,用来对比数组的新旧状态,精准检测新增和移除的元素。认证检查:基础规则确保只有已登录的用户才能读写数据,避免匿名用户的恶意操作。
Update规则拆解:
request.resource.data.likes is list:防止likes被改成非数组类型(比如字符串、对象),保证数据结构一致性。likeChanges = request.resource.data.likes.diff(resource.data.likes):生成新旧likes数组的差异对象,包含added()(新增元素)和removed()(移除元素)两个方法。likeChanges.added().hasOnly([request.auth.uid]):严格限制新增的元素只能是当前用户的UID,不管是用arrayUnion还是直接替换数组,只要新增了其他用户ID就会被拒绝。likeChanges.removed().hasOnly([request.auth.uid]):这条是可选的——如果允许用户取消点赞(移除自己的UID),就保留这条,确保用户只能移除自己的ID,不能删除别人的点赞;如果不允许取消点赞,直接删除这条即可。
Create规则:确保创建食谱时,likes数组要么是空的,要么只包含创建者自己的UID,避免初始就注入其他用户ID。
正确的前端操作示例
在前端代码中,推荐使用Firestore的arrayUnion和arrayRemove方法来修改likes数组,这样既高效又符合规则要求:
// 点赞操作:添加当前用户UID到likes数组 firebase.firestore().collection('Recipes').doc('recipe-id').update({ likes: firebase.firestore.FieldValue.arrayUnion(firebase.auth().currentUser.uid) }); // 取消点赞操作:移除当前用户UID(如果规则允许的话) firebase.firestore().collection('Recipes').doc('recipe-id').update({ likes: firebase.firestore.FieldValue.arrayRemove(firebase.auth().currentUser.uid) });
测试验证
你可以用Firebase控制台的规则模拟器来测试:
- 模拟已认证用户,尝试添加其他用户UID,规则应该拒绝请求。
- 模拟已认证用户,添加自己的UID,规则应该允许请求。
- 尝试移除别人的UID,规则会拒绝(如果保留了移除检查的话)。
内容的提问来源于stack exchange,提问作者Dani
相关产品推荐
相关产品推荐

