如何配置Firestore规则 仅管理员可编辑文档roles字段 用户仅可编辑自身其他信息
Firestore 个人资料字段分级权限安全规则配置
完整规则示例
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 匹配个人资料文档路径 match /profiles/{uid} { // 读权限可根据自身需求调整,示例为登录用户仅可读自己的资料 allow read: if request.auth != null && request.auth.uid == uid; // 新建文档规则 allow create: if request.auth != null && request.auth.uid == uid // 禁止用户创建文档时自行设置roles字段,避免自行提权 && !('roles' in request.resource.data); // 更新文档规则(核心分级权限逻辑) allow update: if request.auth != null { // 提取本次更新涉及的所有字段 let changedFields = request.resource.data.diff(resource.data).affectedKeys(); // 规则1:只要修改了非roles字段,必须是文档所属用户本人操作 let canEditPersonalFields = !changedFields.removeAll(['roles']).size() > 0 || request.auth.uid == uid; // 规则2:只要修改了roles字段,必须操作用户为admin let canEditRoles = !('roles' in changedFields) || get(/databases/$(database)/documents/profiles/$(request.auth.uid)).data.roles.admin == true; // 两个规则同时满足才放行 return canEditPersonalFields && canEditRoles; } } } }
核心逻辑说明
- 基础权限兼容:完全保留你已有的「普通用户仅可编辑自身非敏感字段」的规则逻辑,原有编辑个人资料的功能不受影响
- 提权风险拦截:创建文档阶段禁止用户自行传入
roles字段,避免用户注册时直接给自己设置admin权限 - 字段级权限隔离:
- 所有非
roles字段的修改,无论操作者身份,都仅允许文档对应的用户本人操作,哪怕是admin也无法修改其他用户的个人信息 - 只有当操作用户自身的
roles.admin属性为true时,才允许修改任何用户的roles字段
- 所有非
注意:校验管理员身份时,直接从数据库读取当前操作用户的真实角色信息,而非从请求参数或待修改文档中取值,完全避免伪造admin身份的风险。
内容的提问来源于stack exchange,提问作者J4N
相关产品推荐
相关产品推荐

