Firestore安全规则问题:仅允许用户更新自身嵌套员工信息
解决Firestore仅允许用户更新自身员工信息的规则问题
原规则失效的核心原因
你的规则里写错了字段名:文档结构中存储员工状态的是employeeInfo.employeeStatus,但规则里写成了employeeInfo.employees,路径不匹配导致规则无法正确识别合法的更新操作。
正确的规则写法
除了修正字段名,还要确保用户只能修改自己UID对应的状态字段,同时不能改动文档中的其他内容(比如workplace、area、employeeInfo.count或其他员工的状态),以下是完整的规则示例:
allow update: if request.auth != null // 1. 确保仅修改了自身UID对应的员工状态字段 && request.resource.data.diff(resource.data).affectedKeys().hasOnly([ 'employeeInfo.employeeStatus.' + request.auth.uid ]) // 2. 验证顶级核心字段未被篡改 && request.resource.data.workplace == resource.data.workplace && request.resource.data.area == resource.data.area // 3. 验证员工总数等其他嵌套字段未被修改 && request.resource.data.employeeInfo.count == resource.data.employeeInfo.count;
补充说明
- 如果允许用户首次添加自己的状态(即之前文档中没有该用户的UID条目),无需额外校验;如果仅允许修改已有状态,可以添加
resource.data.employeeInfo.employeeStatus.keys().has(request.auth.uid)确保用户只能修改自己已存在的条目。 - 使用
diff().affectedKeys()可以精准对比前后文档的差异键,确保只有目标字段被修改,避免遗漏其他潜在的非法修改。
内容的提问来源于stack exchange,提问作者Soerman
相关产品推荐
相关产品推荐

