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

如何配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:36:03