Firebase实时数据库安全规则失效,查询遇permission_denied问题求助
解决Firebase Realtime Database权限拒绝问题
问题根源
你的安全规则应该是限制了已认证用户仅能访问自己UID对应的/users/{uid}节点,但你的代码尝试读取整个/users节点并通过identifier(邮箱)进行查询,这种跨节点的查询操作不符合当前的权限规则,因此被拒绝。
解决方案
方案一:直接通过UID访问自己的数据(推荐)
既然用户已经完成认证,你可以直接获取当前用户的UID,访问其对应的节点,完全符合安全规则:
const currentUser = firebase.auth().currentUser; if (currentUser) { // 直接访问当前用户的UID节点 const userRef = firebase.database().ref(`/users/${currentUser.uid}`); userRef.once("value").then((snapshot) => { const userData = snapshot.val(); if (userData) { this.globalvar.userName = userData.name; this.globalvar.userCompany = userData.company; } }); }
方案二:调整安全规则支持邮箱查询
如果必须通过邮箱查询用户数据,需要修改安全规则,允许已认证用户仅查询自己邮箱对应的记录:
{ "rules": { "users": { // 允许已认证用户基于identifier字段查询自己的邮箱 ".read": "auth != null && query.orderByChild === 'identifier' && query.equalTo === auth.token.email", "$uid": { // 保留原有的写入权限规则 ".write": "$uid === auth.uid" } } } }
修改规则后,你的原代码即可正常运行,但要确保:
- 用户是通过邮箱密码方式登录的,且Firebase控制台已启用邮箱认证(确保
auth.token.email能获取到用户邮箱) - 查询的
equalTo参数确实是当前用户的邮箱
注意事项
- 执行数据库操作前,务必确认用户已完成认证(
firebase.auth().currentUser不为null),否则安全规则会直接拒绝访问 - 方案一的性能和安全性更优,因为直接定位到单个节点,无需遍历整个
users节点
内容的提问来源于stack exchange,提问作者lei lei
相关产品推荐
相关产品推荐

