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
相关产品推荐
相关产品推荐

