You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中Firebase实时数据库用户认证后权限拒绝问题

解决Firebase自定义App实例下认证后读取Realtime Database权限被拒问题

嘿,这个问题我之前也碰到过!核心原因是你创建的那个名为db2的自定义FirebaseApp实例,并没有自动关联上你通过Google登录获取的用户认证信息。默认情况下,firebase_auth插件会把用户的登录状态绑定到默认的FirebaseApp实例上,但自定义的App实例是完全独立的,它不会自动继承默认实例的认证状态,所以数据库规则里的auth != null判断自然就失败了,返回-3,Permission denied。

下面是具体的解决步骤,照着做就能搞定:

1. 获取自定义App对应的FirebaseAuth实例

不要直接用默认的FirebaseAuth.instance,而是通过你的db2App实例来获取专属的Auth对象:

// 先获取你之前创建的db2 FirebaseApp实例
FirebaseApp db2App = FirebaseApp.instanceFor(name: 'db2');
// 基于这个App实例创建对应的FirebaseAuth对象
FirebaseAuth db2Auth = FirebaseAuth.instanceFor(app: db2App);

2. 将Google登录凭证同时关联到自定义Auth实例

你原来的登录流程只给默认Auth实例传了凭证,现在要把同一个凭证也传给db2Auth,让自定义App实例也能识别到当前登录用户:

// 保留你原有的Google登录流程代码
final GoogleSignInAccount googleUser = await GoogleSignIn().signIn();
final GoogleSignInAuthentication googleAuth = await googleUser.authentication;
final AuthCredential credential = GoogleAuthProvider.getCredential(
  accessToken: googleAuth.accessToken,
  idToken: googleAuth.idToken,
);

// 登录默认Auth实例(这部分你已经写了,保留即可)
await FirebaseAuth.instance.signInWithCredential(credential);
// 新增:同时登录自定义的db2Auth实例
await db2Auth.signInWithCredential(credential);

3. 使用自定义App实例初始化FirebaseDatabase

确保你访问数据库时,用的是绑定了db2App的Database实例,而不是默认的:

// 基于db2App创建对应的FirebaseDatabase实例
FirebaseDatabase db2Database = FirebaseDatabase.instanceFor(app: db2App);
// 接下来用这个实例去读取数据
DatabaseReference dataRef = db2Database.reference().child('your-target-path');
DataSnapshot snapshot = await dataRef.once();

补充说明

每个FirebaseApp实例都是完全独立的沙箱,它们的认证状态、配置参数都是分开管理的。只有当自定义App实例对应的Auth对象完成登录后,数据库规则里的auth变量才会指向这个实例下的登录用户,auth != null的判断才会生效。

完成这些步骤后,你就可以把数据库规则改回.read": "auth != null"了,不会再出现权限被拒的问题。

内容的提问来源于stack exchange,提问作者atreeon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:44:40