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

如何创建Firebase规则以校验用户自定义属性

刚好之前处理过类似的Firebase规则校验需求,结合你的数据结构,我整理了一套分步的规则方案,帮你确保用户属性的合法性:

Firebase安全规则校验用户属性指南

1. 基础必填字段校验

首先得确保用户的核心属性(address、siteLink、subSiteLink)都存在且是有效的非空字符串,避免空值或者错误类型的数据存入:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // 匹配单个用户节点
    match /user/{uid} {
      // 允许创建和更新操作的基础校验
      allow create, update: if 
        request.resource.data.address is string && request.resource.data.address != "" &&
        request.resource.data.siteLink is string && request.resource.data.siteLink != "" &&
        request.resource.data.subSiteLink is string && request.resource.data.subSiteLink != "";
      
      // 读取规则建议限制为用户自己访问(可根据需求调整)
      allow read: if request.auth != null && request.auth.uid == uid;
    }
  }
}

2. 关联站点存在性校验

接下来要确保用户填写的siteLink和subSiteLink对应的站点和子站点确实存在于你的site节点中,这里用到Firebase规则的exists()函数做跨节点验证:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /user/{uid} {
      allow create, update: if 
        // 保留基础字段校验
        request.resource.data.address is string && request.resource.data.address != "" &&
        request.resource.data.siteLink is string && request.resource.data.siteLink != "" &&
        request.resource.data.subSiteLink is string && request.resource.data.subSiteLink != "" &&
        // 校验对应站点和子站点存在
        exists(/databases/$(database)/documents/$(request.resource.data.siteLink)/$(request.resource.data.subSiteLink));
      
      allow read: if request.auth != null && request.auth.uid == uid;
    }

    // 必须给site节点设置读取权限,否则规则引擎无法执行exists检查
    match /{siteId}/{subsiteId} {
      // 这里可以根据站点数据的敏感度调整,比如只允许认证用户访问
      allow read: if true;
    }
  }
}

3. 区分创建与更新的细化规则

如果你的业务需求是:用户创建账号时必须指定合法的站点,后续更新只能修改地址,不能变更站点信息,可以拆分规则:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /user/{uid} {
      // 创建时严格校验所有字段和关联站点
      allow create: if 
        request.resource.data.address is string && request.resource.data.address != "" &&
        request.resource.data.siteLink is string && request.resource.data.siteLink != "" &&
        request.resource.data.subSiteLink is string && request.resource.data.subSiteLink != "" &&
        exists(/databases/$(database)/documents/$(request.resource.data.siteLink)/$(request.resource.data.subSiteLink));
      
      // 更新时只允许修改address,锁定siteLink和subSiteLink
      allow update: if 
        request.resource.data.address is string && request.resource.data.address != "" &&
        request.resource.data.siteLink == resource.data.siteLink &&
        request.resource.data.subSiteLink == resource.data.subSiteLink;
      
      allow read: if request.auth != null && request.auth.uid == uid;
    }

    match /{siteId}/{subsiteId} {
      allow read: if true;
    }
  }
}

几个关键提醒

  • 权限兼容性:site节点的读取权限一定要确保规则引擎能访问,否则exists()检查会失败,如果站点数据敏感,不要直接用allow read: if true;,可以改成allow read: if request.auth != null;或者更严格的权限。
  • 测试验证:一定要用Firebase控制台的规则模拟器测试各种场景,比如创建合法用户、提交不存在的站点信息、尝试修改站点字段等,确保规则符合预期。
  • 格式扩展:如果需要对address做更严格的格式校验(比如邮箱、具体地址格式),可以用正则表达式,比如request.resource.data.address.matches("^[a-zA-Z0-9\\s,-]+$")来匹配地址格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:24:55