You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase配置读取规则后仍无法获取数据,求排查

问题

在前端使用Firebase实时数据库获取数据时遇到权限问题,具体情况如下:

数据库规则配置

{
    "rules": {
        "users": {
            ".indexOn": "username",
            "$userId": {
                ".indexOn": "username",
                ".read": "$userId==auth.uid",
                ".write": "$userId==auth.uid",
                "favorites": {
                    ".indexOn": "thumb"
                }
            }
        },
        "files": {
            ".indexOn": ["uploadId", "uploadedBy", "fileURL"],
            "$fileId": {
                ".write": "newData.child('uploadedBy').val() == auth.uid",
                ".read": "data.child('uploadedBy').val() == auth.uid",
                ".indexOn": "fileURL"
            }
        },
        "uploads": {
            "$id": {
                ".write": "newData.child('createdBy').val() == auth.uid || data.child('assignedModeratorId').val() == auth.uid",
                ".read": "data.child('createdBy').val() == auth.uid || data.child('assignedModeratorId').val() == auth.uid"
            },
            ".indexOn": ["createdBy", "status", "assignedModeratorId"]
        }
    }
}

前端调用代码

const snapshot = await firebase.database().ref('uploads').orderByChild('createdBy').equalTo(uid).limitToLast(1000).once('value');

报错信息

Error: permission_denied at /uploads: Client doesn't have permission to access the desired data.

注:云函数中使用Admin SDK可正常访问该节点数据,uploads节点数据示例见配图。

解答

问题出在**uploads节点的规则层级**:你仅给uploads/$id子节点配置了读取权限,但未给根节点uploads配置对应读取权限。

Firebase实时数据库规则是自上而下验证的,当直接读取uploads根节点时,系统会先校验uploads节点的读取权限,而当前规则里uploads本身没有.read规则,默认拒绝访问,即便子节点有权限也无法通过根节点的验证。

修改方案

在uploads节点下添加匹配前端查询逻辑的.read规则,允许用户读取createdBy等于自身UID,或assignedModeratorId等于自身UID的上传记录。修改后的uploads规则如下:

"uploads": {
    ".indexOn": ["createdBy", "status", "assignedModeratorId"],
    // 新增根节点读取规则,匹配查询条件
    ".read": "query.orderByChild == 'createdBy' && query.equalTo == auth.uid || query.orderByChild == 'assignedModeratorId' && query.equalTo == auth.uid",
    "$id": {
        ".write": "newData.child('createdBy').val() == auth.uid || data.child('assignedModeratorId').val() == auth.uid",
        ".read": "data.child('createdBy').val() == auth.uid || data.child('assignedModeratorId').val() == auth.uid"
    }
}

说明

  • 根节点的.read规则通过query对象验证前端查询条件,确保只有符合createdBy=auth.uid或assignedModeratorId=auth.uid的查询能通过权限校验。
  • 子节点的.read规则保留,用于单独访问某个uploads/$id节点时的权限验证。
  • 云函数用Admin SDK默认拥有全权限,不受规则限制,因此能正常访问。

内容的提问来源于stack exchange,提问作者Cedric Hadjian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 08:30:44