You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]);
    }
  }
}

规则细节解释

  1. 规则版本2:必须声明rules_version = '2';,因为diff()方法是版本2新增的,用来对比数组的新旧状态,精准检测新增和移除的元素。

  2. 认证检查:基础规则确保只有已登录的用户才能读写数据,避免匿名用户的恶意操作。

  3. 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,不能删除别人的点赞;如果不允许取消点赞,直接删除这条即可。
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:04:10