Firebase Realtime Database规则data.child('uid').val() === auth.uid不生效问题
问题原因
- 你配置的规则里用到的
data变量指代的是写入操作执行前,目标路径已经存在的旧数据,你测试时直接向/Posts2路径写入新数据,该路径此前没有uid子节点,data.child('uid').val()返回值为null,自然匹配不上auth.uid,所以写入被拒绝。 - 你没有对写入的新数据做校验,规则里没有用到指代新写入数据的
newData变量,无法匹配你要校验写入内容中uid的需求。
解决方案
场景1:/Posts2下存储多条帖子,每条帖子对应一个发布用户(绝大多数场景)
你需要将规则下沉到Posts2的子节点层级,同时校验新写入数据的uid和当前登录用户id一致,正确规则如下:
{ "rules": { "Posts2":{ ".read":true, "$postId": { // 新增/更新/删除都要求新数据的uid和当前登录用户id匹配 ".write": "auth != null && newData.child('uid').val() === auth.uid" } } } }
测试注意:在Rules Playground测试时,操作位置需要改为/Posts2/[任意帖子ID],比如/Posts2/post001,其他参数不变即可测试通过。
场景2:/Posts2路径直接存储当前登录用户的单条数据
如果你确实需要直接操作/Posts2根路径写入数据,修改.write规则校验新写入数据的uid即可:
{ "rules": { "Posts2":{ ".read":true, ".write": "auth != null && newData.child('uid').val() === auth.uid" } } }
这种场景下按你原来的测试参数即可测试通过。
内容的提问来源于stack exchange,提问作者Areeb
相关产品推荐
相关产品推荐

