Firebase Realtime Database匹配email的读规则不生效排查
规则失效核心原因
你的规则不生效是路径匹配层级错误,具体问题点:
- 现有规则在
timestamp节点层级查找email字段,也就是会去读/timestamp/email路径的值,但你的实际数据结构里,email是存在/timestamp下每一条push ID生成的子记录内部的,timestamp节点本身没有email子字段,匹配逻辑永远不成立,自然会拦截合法用户的读取请求。 - 读规则没有做登录态前置校验,未认证用户发起请求时,
auth.token不存在会直接触发规则报错,直接拒绝访问。
可用修正规则(无需改动现有线上数据结构)
{ "rules": { "timestamp": { "$recordId": { // 匹配timestamp下所有单条记录,校验登录态+邮箱匹配 ".read": "auth !== null && data.child('email').val() === auth.token.email", ".write": "auth !== null" } } } }
关键说明
$recordId是Firebase规则的通配符,会自动匹配timestamp下的所有子记录ID,规则会在单条记录的层级读取当前记录内存储的email字段,和当前登录用户的账号邮箱做精确匹配,完全适配你现有数据结构,不需要调整任何线上存储的数据。- 切记不要在
timestamp父节点配置.read规则,Firebase Realtime Database的规则是自上而下生效的,只要上层节点匹配到读权限,就会直接放行,不会再校验下层规则,很容易出现全量数据泄露的风险。 - 用Rules Playground测试时,不要直接模拟读取
/timestamp全路径,这个路径本身就没有开放读权限,被拦截是正常的;你需要模拟读取/timestamp/[某条存在的记录ID]路径,选择已认证、邮箱和该记录email字段一致的测试账号,才会正常放行,符合最小权限的安全要求。
内容的提问来源于stack exchange,提问作者Hardik Shekhat
相关产品推荐
相关产品推荐

