如何配置Firebase Realtime Database规则仅允许指定邮箱用户访问
安全规则失效根因
- 权限继承逻辑错误:Firebase Realtime Database 规则遵循权限一旦在父节点授予,子节点无法撤销的原则,你第一版规则在根节点直接配置了
.read: auth != null、.write: auth != null,等于给所有登录用户开放了全库读写权限,子路径的限制规则完全不会生效。 - 白名单校验逻辑错误:第二版规则的写入校验取了
newData.child('email')的字段值,不仅会因为写入节点无email字段直接报错,还存在被用户提交伪造邮箱字段绕过校验的风险,正确逻辑应该直接取登录态的auth.token.email做校验。 - 规则结构不完整:第二版规则没有配置统一的全局读权限,不同业务节点的权限逻辑没有对齐。
白名单方案规则配置(推荐,便于后续新增授权邮箱)
前置操作
先在数据库根节点创建whitelist节点,授权邮箱的.替换为%2E作为key,value设为true,示例结构:
{ "whitelist": { "augustomarce100@hotmail%2Ecom": true, "other-admin@example%2Ecom": true } }
后续新增授权邮箱直接往whitelist节点加对应记录即可,无需修改规则。
完整规则代码
{ "rules": { // 全局读权限:所有登录用户可访问全库数据 ".read": "auth != null", // 全局默认关闭写权限,仅在子节点单独开放 ".write": false, // 白名单节点权限:仅已在白名单内的用户可修改白名单 "whitelist": { ".read": true, ".write": "root.child('whitelist').child(auth.token.email.replace('.', '%2E')).exists()" }, // 你的业务节点权限配置,所有需要开放写权限的节点都可以复用该逻辑 "registries": { "$uid": { "user": { ".write": "root.child('whitelist').child(auth.token.email.replace('.', '%2E')).exists()" } } } } }
如果需要更高安全性,可以在校验逻辑中加auth.token.email_verified === true,限制仅邮箱验证通过的白名单用户可写入。
单管理员硬编码方案(无需白名单节点,适合仅固定1个授权用户的场景)
如果不需要动态新增授权用户,可以直接用简化版规则:
{ "rules": { ".read": "auth != null", ".write": "auth != null && auth.token.email === 'augustomarce100@hotmail.com'" } }
校验方法
直接使用Firebase控制台自带的「规则游乐场」功能,分别模拟白名单用户、普通用户的读写请求,验证权限是否符合预期即可。前端代码无需做修改,所有权限控制以数据库规则为准。
内容的提问来源于stack exchange,提问作者Augusto Marcelo Galarza Covarr
相关产品推荐
相关产品推荐

