首页 > 解决方案 > 为什么我的 Firebase 实时数据库规则会破坏我的 HandleValueChanged?

问题描述

早上好!

我正在我的 Unity 游戏中处理 Firebase 项目,并且正在努力保护数据库中的数据,但是每当我更新规则时,它都会破坏我的(否则工作的)handlevaluechanged 函数。

数据结构如下所示:

User_List -> Firebase_User_ID -> 健康:100,名称:Foo 等....

我希望这些数据的规则(至少,我稍后会添加验证)是:

"USER_LIST":
{
    "$UID" :
    {
            ".read": "auth.uid === $UID",
            ".write" : "auth.uid === $UID",
    }
},

在游戏本地,我得到了这个调用的参考:

FirebaseDatabase.DefaultInstance.GetReference("USER_LIST").Child(USER_ID).ValueChanged += HandleValueChanged;

如果我将规则设置为:

            ".read": true,
            ".write" : true

一切都按预期工作。客户端可以更新数据库,handlevaluechanged 完成保持本地数据同步的工作。当我切换到上面验证身份验证 ID 的规则时,客户端仍然可以工作。只要登录了正确的用户 ID,它就可以毫无问题地更新数据库。但是,我的 Handlevaluechanged 从 firebase 获得了权限被拒绝错误,就好像 handlevaluechanged 侦听器在尝试从数据库读取时没有提供正确的用户 ID。

我很困惑,因为规则允许我首先获取参考,并从客户端更新数据库,但我不能从数据库更新客户端?我错过了什么?

我还尝试在 USER_LIST 节点而不是 USER_ID 节点上获取相同的结果。

任何见解将不胜感激!先感谢您。

标签: firebaseunity3dfirebase-realtime-databasefirebase-security

解决方案


在忽略了这个问题一段时间并处理了其他错误之后,我发现了真正的问题并想发布以防其他人发现自己在这个泡菜中。

我有一个 Unity 场景专门用于登录创建经过身份验证的 Firebase 用户的用户,然后跳转到一个新场景。在那个新场景中,我搜索了用户登录时创建的本地用户对象,然后设置了数据库引用和 handleValueChanged 侦听器。

我认为问题是搜索用户是异步完成的(我还没有做更多的研究来证实这一点,但我在这个特定案例中的测试似乎表明是这种情况),所以任务开始了,虽然它正在寻找用户凭据,它创建了数据库引用并添加了一个具有空用户的侦听器。之后,任务完成,用户不再为空,但监听器已经在监听。

然后,如果我进行数据库读取或写入,则读取或写入调用来自经过身份验证的用户,并且只要满足 RTB 规则,就会执行。成功的写入将触发 handlevaluechanged 侦听器并绘制一个权限被拒绝错误,因为侦听器没有与之关联的经过身份验证的用户 ID(同样,我得出这个结论是基于对这个特定项目的观察和测试,而不是研究)。

只需在创建本地用户对象后将数据库引用添加到本地用户对象,而不是搜索用户然后建立引用即可解决我的所有问题。

我希望这有帮助!


推荐阅读