Flutter Firebase 实时数据库:“[permission-denied] 客户端无权访问所需数据。”问题

Posted

技术标签:

【中文标题】Flutter Firebase 实时数据库:“[permission-denied] 客户端无权访问所需数据。”问题【英文标题】:Flutter Firebase Realtime Database: "[permission-denied] Client doesn't have permission to access the desired data." Problem 【发布时间】:2022-01-15 23:34:31 【问题描述】:

我在使用 Flutter 的 Firebase 实时数据库 (RTDB) 时遇到问题。 我在一个项目中使用带有匿名身份验证的 RTDB。

有时,当我在设备或模拟器上运行应用程序时,标题中会出现错误:[firebase_database/permission-denied] 客户端无权访问所需数据。

如果我在不接触任何东西的情况下重新运行应用程序,应用程序会按预期运行,不会出现任何权限错误。我面临这个问题的概率大约为 20 分之一或 30 分之一。

我的 RTDB 的原始规则集是(因为我使用匿名登录):


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

然后我以为是这个问题,把规则改成了,但是没有去掉匿名认证的代码段:


  "rules": 
    ".read": true, //"auth != null",
    ".write": false //"auth != null",
  

编辑:

事实证明,即使不使用身份验证功能,问题仍然存在。我意识到的最重要的一点是,问题的可能性随着 wifi 信号强度的降低而增加。我将代码简化为:

void main () async 
  WidgetsFlutterBinding.ensureInitialized();
  FirebaseApp app = await Firebase.initializeApp();
  await FirebaseDatabase.instance.ref()
      .child('otomodels')
      .get()
      .then((DataSnapshot? snap) => otomodels = snap!.value);

  print('It is OK');

我在 ios 模拟器上运行该应用程序。问题发生时的日志是:

2021-12-12 15:12:44.915068+0300 Runner[39169:341996] 启用金属 API 验证

2021-12-12 15:12:45.367316+0300 Runner[39169:341996] 编写分析变体。

2021-12-12 15:12:45.410703+0300 Runner[39169:342197] 8.9.0 - [Firebase/Core][I-COR000005] 尚未配置任何应用。

2021-12-12 15:12:49.494185+0300 Runner[39169:342212] [VERBOSE-2:ui_dart_state.cc(209)] 未处理的异常:[firebase_database/permission-denied] 客户端无权访问所需数据。

#0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:607:7)

#1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:167:18)

#2 MethodChannel.invokeMapMethod (package:flutter/src/services/platform_channel.dart:367:43)

#3 MethodChannelQuery.get(包:firebase_database_platform_interface/src/method_channel/method_channel_query.dart:74:22)

#4 Query.get (package:firebase_database/src/query.dart:21:27)

#5 main (package:myProject/main.dart:29:3)

#0 MethodChannelQuery.get(包:firebase_database_platform_interface/src/method_channel/method_channel_query.dart:86:7)

#1 Query.get (package:firebase_database/src/query.dart:21:27)

#2 main (package:myProject/main.dart:29:3)

【问题讨论】:

以下可能的答案和解决方案。如果这不能帮助您解决问题,请编辑您的问题以包括minimal, complete/standalone code that reproduces the problem。 我找到了解决问题的方法。由于它独立于 auth 功能并且与使用低速网络连接连接 RTDB 有关,因此如果 .get().then() 例程捕获此错误,我将重新启动状态。 【参考方案1】:

听起来您正试图在用户登录之前从数据库中读取数据。由于您的安全规则要求有一个活动用户,这将导致规则拒绝读取。

请记住,当应用程序刚启动时,FirebaseAuth.instance.currentUser 最初可能是 null,因此您需要收听 authStateChanges,而不是像 https://firebase.flutter.dev/docs/auth/usage#authentication-state 中所示的那样

【讨论】:

感谢您的帮助。我认为您提到的问题可能是问题所在,这就是为什么我将规则从“auth!= null”更改为“true”。我希望登录不再是问题,但它仍然可能适用于 firebase,因为我没有删除匿名登录的代码片段。我会试试你的建议。

以上是关于Flutter Firebase 实时数据库:“[permission-denied] 客户端无权访问所需数据。”问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 Firebase 实时数据库 Flutter 进行实时更新

Flutter:Firebase 实时数据库 orderByChild 对查询结果没有影响

如何从 Firebase 实时数据库中获取数据到 Flutter 中的列表中?

如何使用 Flutter 和 Firebase 实时数据库实现邀请系统 [关闭]

使用flutter如何在同一个App中使用多个firebase实时数据库

如何在flutter中从firebase实时数据库中获取数据?