如何配置规则禁止读取Firebase数据库中特定的pw敏感字段
解决方案
Firebase 安全规则遵循上级权限一旦放行,下级规则无法覆盖拦截的逻辑,所以直接给user app/profile/{uid}节点开放读取权限后,单独给pw字段设禁止读取是无效的,你可以用以下两种方案实现需求:
方案1:拆分数据结构(官方首推,稳定性最高)
把敏感字段和普通字段拆分到不同的存储路径:
- 普通用户资料仍放在
user app/profile/{uid}路径下,正常配置读取权限 - 敏感的
pw字段单独存储到user app/private/{uid}路径下,直接给该路径配置.read = false,禁止所有人读取
// 实时数据库规则示例 { "rules": { "user app": { "profile": { "$uid": { // 按业务需求配置正常读权限,比如仅用户自己可读 ".read": "auth != null && auth.uid == $uid", ".write": "auth != null && auth.uid == $uid" } }, "private": { "$uid": { ".read": false, // 仅允许用户自己修改密码字段 ".write": "auth != null && auth.uid == $uid" } } } } }
方案2:查询字段校验(无需修改现有数据结构)
如果暂时不想调整数据结构,可以在读取规则中强制要求请求必须明确指定返回字段,且不能包含pw:
// 实时数据库规则示例 { "rules": { "user app": { "profile": { "$uid": { ".read": "auth != null && auth.uid == $uid && query.select && !query.select.hasAny(['pw'])", ".write": "auth != null && auth.uid == $uid" } } } } }
注意:该方案要求前端读取数据时必须显式调用
select方法指定要返回的非敏感字段,不带pw即可正常读取,直接查询整个uid节点会被拦截。
如果用的是 Cloud Firestore,逻辑和上面一致,拆分集合或者在规则中校验request.query.mask不包含pw字段即可。
内容的提问来源于stack exchange,提问作者Tech Info
相关产品推荐
相关产品推荐

