Firebase配置用户屏蔽规则后全局搜索权限被拒如何解决
问题核心错误点
1. 校验逻辑主体颠倒
你当前规则校验的是「当前登录用户是否屏蔽了被访问用户」,但需求是「如果被访问用户屏蔽了当前登录用户,就禁止访问」,校验主体完全搞反。
2. 权限判断逻辑写反
原规则中多层否定嵌套后,实际生效逻辑为「只有当前登录用户屏蔽了对方时,才允许访问对方数据」,和预期完全相反。
3. 违背Firebase规则特性
Firebase实时数据库规则不是过滤器:父节点没有读权限的前提下,即便子节点配置了读权限,直接查询父节点也会直接被拒绝,不会自动过滤符合条件的子节点。你做全站用户搜索时直接监听/users根节点,该节点没有配置读权限,因此直接触发权限报错。
4. 额外安全漏洞
你原有配置中/users/$uid的写权限没有加归属校验,任何人都可以修改任意用户的资料,存在严重安全问题。
修复方案
第一步:修正单用户访问权限
把/users/$uid的读权限修改为如下逻辑:
".read": "auth != null && !root.child('users').child($uid).child('blocks').hasChild(auth.uid)", ".write": "auth != null && auth.uid == $uid"
逻辑解释:仅当当前登录用户不为空,且被访问用户的屏蔽列表中没有当前登录用户时,才允许读取该用户数据;仅用户本人可以修改自己的资料。
第二步:解决用户搜索权限问题
有两种可选方案:
- 方案1(推荐):用云函数做搜索接口
所有用户搜索请求由云函数处理,云函数持管理员权限可读取全量用户数据,过滤掉屏蔽了当前请求用户的账号后再返回结果,无需修改父节点权限,也不会泄露用户屏蔽关系等敏感数据。 - 方案2:配置父节点查询权限
如果不想使用云函数,可以给/users节点加查询限制权限,允许前端带限制条件的查询:
注意:该方案下前端拉取到的查询结果仍会包含屏蔽了当前用户的账号,需要前端额外做一层过滤,或者单独将屏蔽关系存储到前端不可读的节点避免泄露。{ "rules": { "users": { // 仅允许最多拉取50条的查询,防止恶意拉取全量用户数据 ".read": "auth != null && query.limitToFirst <= 50", "$uid": { ".read": "auth != null && !root.child('users').child($uid).child('blocks').hasChild(auth.uid)", ".write": "auth != null && auth.uid == $uid" } }, "posts": { "$postId": { ".read": "auth != null", ".write": "auth != null" } } } }
内容的提问来源于stack exchange,提问作者JuFa512
相关产品推荐
相关产品推荐

