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
相关产品推荐
相关产品推荐

