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
相关产品推荐
相关产品推荐

