如何设置Firestore权限使部分私有数据仅后端可访问、不对前端暴露
Firebase Firestore 敏感字段禁止前端访问解决方案
你可以在不拆分现有数据结构的前提下,通过以下几种方式实现privateKey字段仅后端可访问的需求:
方案1:通过安全规则限制前端仅可查询非敏感字段
Firestore安全规则支持校验请求的字段掩码,你可以直接限制普通用户的查询请求只能获取除privateKey之外的字段,请求包含敏感字段时直接拒绝访问,规则示例如下:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /school/{schoolId}/class/{studentId} { allow read: if request.auth != null && (!("privateKey" in request.query.fields) || request.auth.token.is_backend == true); // 写入规则可根据你的业务需求自行补充 } } }
注意:使用该规则时,前端查询必须显式指定要获取的非敏感字段,示例查询代码如下:
// 前端React查询代码 const studentDoc = await db .collection("school") .doc(schoolId) .collection("class") .doc(studentId) .select("id", "name", "roll") // 显式指定不包含privateKey的字段 .get();
后端使用服务账号访问时默认绕过安全规则,你也可以给服务账号对应的身份添加is_backend自定义声明,即可正常获取全量字段。
方案2:前端所有Firestore查询走Node.js后端代理
如果不想维护复杂的安全规则,可以直接取消前端对该集合的直接访问权限,所有学生数据的查询请求统一发给你的Node.js后端接口:
- 后端收到请求后,先校验用户身份合法性
- 从Firestore拉取全量学生数据
- 手动删除
privateKey字段后再返回给前端 - 后端内部逻辑需要使用
privateKey时直接操作全量数据即可
该方案逻辑最直观,不会出现规则配置疏漏导致敏感字段泄露的问题。
方案3:使用字段级读写权限控制
你也可以在安全规则中直接限制访问范围,仅后端身份可读取全量字段,普通用户只能读取指定非敏感字段:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /school/{schoolId}/class/{studentId} { // 非敏感字段所有登录用户可读 allow read: if request.auth != null && request.query.fields.hasOnly(["id", "name", "roll"]); // 全量字段仅后端可读 allow read: if request.auth.token.is_backend == true; } } }
内容的提问来源于stack exchange,提问作者Rahul Harlalka
相关产品推荐
相关产品推荐

