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 实时数据库实现邀请系统 [关闭]