【问题标题】:DatabaseError when Login Out of Application退出应用程序时出现数据库错误
【发布时间】:2021-03-26 17:00:07
【问题描述】:

我正在开展一个项目,该项目包含应用程序中的传感器数据和实时数据库数据。每次更新时,我的应用都会使用 StreamBuilder 从传感器接收数据。一切正常,我可以从我的数据库中获取、更新、添加和删除数据,我可以成功登录和注册。但是我在注销我的应用程序时遇到了问题。每次我注销时,都会收到以下错误:

Exception has occurred.
DatabaseError (DatabaseError(1, com.firebase, Permission Denied))

错误来自这个函数,来自“等待”:

// Função para ler o valor da temperatura
  Stream<int> getSensorTemperature() async* {
    final FirebaseUser user = await _auth.currentUser();

    await for(var event in databaseReference.child(user.uid+"/temperature").onValue) {
      yield event.snapshot.value;
    }
  }

我在这个下有一个类似的功能,但没有显示任何错误:

Stream<int> getSensorHumidity() async* {
    final FirebaseUser user = await _auth.currentUser();

    await for(var event in databaseReference.child(user.uid+"/humidity").onValue) {
      yield event.snapshot.value;
    }
  }

这是我的 Firebase 规则:

{
  "rules": {
    ".read": "auth != null",
    ".write":"auth != null"
  }
}

此错误仅在注销时出现,我知道这与我的安全规则有关,但是我的应用每次注销时都会崩溃,我该如何消除此错误?

【问题讨论】:

    标签: flutter firebase-realtime-database firebase-security


    【解决方案1】:

    您的规则目前要求用户必须在您的应用读取或写入数据库中的任何位置时登录。这就是您收到错误的原因。

    你有两个选择。即使没有用户登录,也可以更改规则以允许权限,或者将代码的逻辑更改为仅在有用户登录时读取和写入。

    我建议您使用后者,因为在无需登录的情况下让您的数据库对写入开放可能会导致您的应用出现安全问题。

    您可以在documentation 中阅读有关安全规则的更多信息。

    【讨论】:

    • 出于安全考虑,我已经以这种方式创建了规则,我的应用程序基本上是完整的,但我可以看到并在其中出错,因为如果我注销我不应该得到这个错误,因为我什至不在此代码生效的主页中。
    • 所以,按照我的建议,如果没有用户登录,请不要查询数据库。请他们先重新登录。
    • 是的,但是如果不是从主菜单中调用此函数,它如何查询数据库。
    • 我不知道 - 您将对此进行调试。如果您的特定代码未按您预期的方式运行,请提出一个新问题并显示您的调试详细信息,以说明什么未按您预期的方式运行。问题中需要有足够的信息,以便任何人都可以重现该问题。注意 currentUser 可以为 null,表示没有用户登录。
    • 我的回答是建议您可以做任何您想做的事情,只要您“将代码的逻辑更改为仅在用户登录时读取和写入。”。不管你是用 if 语句还是其他东西来做这件事并不重要。有很多方法可以解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 2018-01-08
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    相关资源
    最近更新 更多