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

Firestore Security Rules嵌套集合配置求助:实现news及comments集合权限要求

Firestore安全规则修正方案

完整优化后规则

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // 通用校验辅助函数
    function isAuthenticated() {
      return request.auth != null;
    }
    function isAdmin() {
      return isAuthenticated() 
        && exists(/databases/$(database)/documents/users/$(request.auth.uid))
        && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.isAdmin == true;
    }
    // news集合规则
    match /news/{docId}{  
      allow read: if true;
      // 创建、删除操作仅限管理员
      allow create, delete: if isAdmin();
      // 更新操作分场景校验
      allow update: if isAdmin() 
        // 仅更新统计字段场景:viewCount所有用户可改,commentsCount仅限已认证用户改
        || (request.resource.data.diff(resource.data).affectedKeys().hasOnly(["viewCount"]))
        || (isAuthenticated() && request.resource.data.diff(resource.data).affectedKeys().hasOnly(["commentsCount"]));
      
      // comments子集合规则
      match /comments/{commentId}{  
          allow read: if true;
          allow create: if isAuthenticated() && request.auth.uid == request.resource.data.userId;
          allow update,delete: if isAuthenticated() && request.auth.uid == resource.data.userId;
      }  
    }
  }
}

核心调整说明

  • 新增通用校验函数避免逻辑重复:isAuthenticated判断用户登录状态,isAdmin从用户集合读取权限标记校验管理员身份,替换原硬编码的admin用户ID逻辑
  • 拆分news集合写权限:创建、删除操作仅管理员可执行;更新操作区分场景,管理员可修改所有字段,普通用户仅能修改viewCount/commentsCount两个统计字段,且符合业务规则限制
  • 保留了原comments子集合的正确逻辑,完全匹配需求:所有用户可查看评论,仅登录用户可发布评论,仅评论作者可修改、删除自己的评论

注意事项

如果业务存在同时更新viewCount和commentsCount两个字段的场景,可自行在更新判断中新增affectedKeys().hasOnly(["viewCount", "commentsCount"]) && isAuthenticated()的判断分支即可。

内容的提问来源于stack exchange,提问作者rnative

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:24:04