Firebase实时数据库规则问题:仅创建者无法读取自身数据
问题原因与修复方案
问题根源
你的查询是直接请求/categories节点(带排序过滤),但当前规则仅给了/$category_id子节点的读取权限,Firebase会优先检查/categories节点本身的读取权限——由于该节点没有配置.read规则,直接返回权限拒绝。
修复后的规则
{ "rules": { "categories": { ".indexOn": ["creator"], // 允许列表查询,但强制按creator过滤且值匹配当前用户UID ".read": "auth != null && query.orderByChild == 'creator' && query.equalTo == auth.uid", "$category_id": { ".read": "data.child('creator').val() === auth.uid", // 优化写入规则:仅登录用户可创建,且creator必须设为自身UID ".write": "!data.exists() && auth != null && newData.child('creator').val() === auth.uid" } }, "ideas": { ".indexOn": ["creator"], ".read": "auth != null && query.orderByChild == 'creator' && query.equalTo == auth.uid", "$idea_id": { ".read": "data.child('creator').val() === auth.uid", ".write": "!data.exists() && auth != null && newData.child('creator').val() === auth.uid" } } } }
规则说明
- 列表查询权限:在
categories/ideas根节点添加.read规则,确保:- 用户已登录(
auth != null) - 查询必须按
creator字段排序 - 查询过滤值严格等于当前用户UID
这就保证了用户只能拉取自己创建的数据列表。
- 用户已登录(
- 单个节点权限:保留子节点的
.read规则,支持单独读取自己创建的单条数据。 - 写入规则加固:新增登录校验和
creator字段匹配校验,避免未登录用户创建数据,或创建时篡改creator值。
模拟器验证注意事项
测试时需在模拟器的查询参数中添加:
orderByChild: creatorequalTo: Codw8lfHuDcUox1Xe4ima15OGXi1(你的测试UID)
再发起/categories路径的get请求,即可通过规则验证。
内容的提问来源于stack exchange,提问作者Loscho19
相关产品推荐
相关产品推荐

