首页 文章

使用带有Flutter的Firebase数据库拒绝权限

提问于
浏览
1

我的团队正在尝试在Flutter应用中使用Firebase实时数据库 . 他们更改了 pubspec.yaml 和两个 build.gradle 文件,并链接了 the google-services.json 文件,如在线教程中所示 . 然而,这些教程似乎是矛盾的(在它们之间,甚至与文档相关) .

以下是其代码的相关部分:

import 'package:flutter/material.dart';
import 'dart:async';
import 'package:firebase_database/firebase_database.dart';
import 'package:firebase_core/firebase_core.dart';

class ProgramPage extends StatefulWidget {
  @override
  _ProgramPageState createState() => new _ProgramPageState();
}

class _ProgramPageState extends State<ProgramPage> {
  List<Conference> _conferences = List();
  DatabaseReference itemRef;

  final GlobalKey<FormState> formKey = GlobalKey<FormState>();

  static Future<FirebaseApp> _getApp() async {
    const FirebaseOptions myOptions = const FirebaseOptions(
      googleAppID: '<id>',
      apiKey: '<key>',
      databaseURL: '<url>',
    );
    FirebaseApp app;
    app = await FirebaseApp.configure(name: "conferences", options: myOptions);
    return app;
  }

  @override
  void initState() {
    super.initState();
    _getApp().then((app) {
      final FirebaseDatabase database = new FirebaseDatabase(app: app);
      itemRef = database.reference().child('conferences');
      itemRef.onChildAdded.listen(_onEntryAdded);
      itemRef.onChildChanged.listen(_onEntryChanged);
    });
  }

  _onEntryAdded(Event event) {
    setState(() {
      _conferences.add(Conference.fromSnapshot(event.snapshot));
    });
  }

  _onEntryChanged(Event event) {
    var old = _conferences.singleWhere((entry) {
      return entry.id == event.snapshot.key;
    });
    setState(() {
      _conferences[_conferences.indexOf(old)] =
          Conference.fromSnapshot(event.snapshot);
    });
  }

  // the build method basically returns a ListView of Conference objects
}

但是当他们在Android模拟器上运行时,他们会遇到以下错误:

W/SyncTree( 7764): Listen at /conferences failed: DatabaseError: Permission denied
E/flutter ( 7764): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter ( 7764): Instance of 'DatabaseError'
E/flutter ( 7764): #0      _rootHandleUncaughtError.<anonymous closure> (dart:async/zone.dart:1114:29)
E/flutter ( 7764): #1      _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
E/flutter ( 7764): #2      _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
E/flutter ( 7764): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter ( 7764): Instance of 'DatabaseError'
E/flutter ( 7764): #0      _rootHandleUncaughtError.<anonymous closure> (dart:async/zone.dart:1114:29)
E/flutter ( 7764): #1      _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
E/flutter ( 7764): #2      _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)

你能解释一下我们有什么问题吗?

编辑:安全规则:

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

编辑2:我们使用Santosh Anand的解决方案来简化规则(安全性在这个项目中不是一个大问题) . 现在我们收到以下消息:

W/zygote  (14174): Unsupported class loader
W/zygote  (14174): Skipping duplicate class check due to unsupported classloader
I/DynamiteModule(14174): Considering local module com.google.android.gms.firebase_database:4 and remote module com.google.android.gms.firebase_database:6
I/DynamiteModule(14174): Selected remote version of com.google.android.gms.firebase_database, version >= 6
W/zygote  (14174): Unsupported class loader
W/zygote  (14174): Skipping duplicate class check due to unsupported classloader
D/NetworkSecurityConfig(14174): No Network Security Config specified, using platform default
I/zygote  (14174): Do partial code cache collection, code=29KB, data=26KB
I/zygote  (14174): After code cache collection, code=29KB, data=26KB
I/zygote  (14174): Increasing code cache capacity to 128KB

3 回答

  • 1

    您必须使用firebase对您的应用程序进行身份验证 .

    要么

    你可以改变安全规则

    {
      "rules": {
        ".read": true,
        ".write": true
      }
    }
    
  • 1

    您必须使用firebase_auth package登录Firebase

    void anonymousLogin() {
        FirebaseAuth.instance.onAuthStateChanged.listen((user) async {
          if (user != null) {
            var isAnonymous = user.isAnonymous;
            var uid = user.uid;
            print(
                'In FirestoreServices, isAnonymous = $isAnonymous and uid = $uid');
          } else {
            FirebaseAuth.instance.signInAnonymously().then((user) {
              print(
                  'In FirestoreServices, isAnonymous = ${user.isAnonymous} and uid = ${user.uid}');
            });
          }
        });
      }
    

    在主窗口小部件中使用该功能匿名登录firebase . 确保在firebase控制台中启用了匿名登录 .

  • 2

    第一个问题:您在身份验证之前访问Firebase,将读写保持为真正的工作,但您的身份验证在安全性方面变得无用 . 第二个问题:这是Firebase插件警告他们正在更新他们的插件,确保你是最新版本

相关问题