如何编写Firestore安全规则:仅Group管理员拥有特定权限,其余用户只读
Firestore安全规则实现方案
规则说明
针对你的群聊数据结构与权限需求,以下是对应的Firestore安全规则实现:
数据结构回顾
主文档路径:/groups/{groupID}
主文档字段:groupID、groupName、adminUID、adminUsername、createDate、creatorUID、creatorUsername、initialGroupCreate
子集合:groupMembersSubcollection
安全规则代码
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 主文档权限控制 match /groups/{groupID} { // 验证用户是否为群成员 function isGroupMember() { return exists(/databases/$(database)/documents/groups/$(groupID)/groupMembersSubcollection/$(request.auth.uid)); } // 验证用户是否为管理员 function isAdmin() { return request.auth != null && request.auth.uid == resource.data.adminUID; } // 验证创建文档时的字段完整性 function isValidCreateFields() { return request.resource.data.keys().hasAll([ 'groupID', 'groupName', 'adminUID', 'adminUsername', 'createDate', 'creatorUID', 'creatorUsername', 'initialGroupCreate' ]) && request.resource.data.keys().size() == 8; } // 读取权限:管理员或群成员均可读取 allow read: if request.auth != null && (isAdmin() || isGroupMember()); // 创建权限:仅管理员可创建,且必须包含指定所有静态字段 allow create: if request.auth != null && isAdmin() && isValidCreateFields(); // 修改/删除权限:禁止所有操作 allow update, delete: if false; } // 子集合权限控制 match /groups/{groupID}/groupMembersSubcollection/{memberID} { // 复用主文档的管理员验证函数 function isAdmin() { return request.auth != null && get(/databases/$(database)/documents/groups/$(groupID)).data.adminUID == request.auth.uid; } // 验证用户是否为群成员(当前用户ID匹配子集合文档ID) function isGroupMember() { return request.auth != null && request.auth.uid == memberID; } // 读取权限:管理员或群成员均可读取 allow read: if request.auth != null && (isAdmin() || isGroupMember()); // 创建/删除权限:仅管理员可操作 allow create, delete: if request.auth != null && isAdmin(); // 修改权限:禁止所有操作 allow update: if false; } } }
规则细节解释
- 主文档部分:
- 读取权限:仅登录用户且为群成员/管理员可访问;
- 创建权限:仅管理员可创建,且必须包含所有指定静态字段,避免额外字段混入;
- 修改/删除:完全禁止,确保静态字段不可变更。
- 子集合部分:
- 读取权限:管理员或对应成员本人可读取;
- 创建/删除:仅管理员可添加或移除群成员;
- 修改:禁止操作,确保成员记录不可篡改。
内容的提问来源于stack exchange,提问作者whatwhatwhat
相关产品推荐
相关产品推荐

