如何创建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
相关产品推荐
相关产品推荐

