Аутентификация Firebase и правила базы данных - PullRequest
0 голосов
/ 24 января 2020

Я новичок в Flutter / Dart, но я пытался выяснить правила БД для проекта, над которым я работаю. Я знаю, что на SO много сообщений о правилах БД Firebase, но все, что я нашел и попробовал, не сработало. В конкретном случае, приведенном ниже, я хочу, чтобы любой мог читать данные, но только автор мог их записывать и редактировать. Я установил в качестве идентификатора пользователя Do c ID, и он прекрасно работает с удаленными разрешениями, но я не могу заставить что-либо работать, когда добавляю ограниченные правила. Что я делаю не так?

Сообщение трассировки стека

I/flutter (17900): PlatformException(Error performing setData, PERMISSION_DENIED: Missing or insufficient permissions., null)
E/flutter (17900): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: setState() called after dispose(): _RegisterState#1360e(lifecycle state: defunct, not mounted)

Мои правила Firebase:

service cloud.firestore {
  match /databases/{database}/documents {
    match /brews/{userId} {
      allow read: if request.auth.uid != null;
      allow write: if request.auth.uid == userId;
    }
  }
}

Код базы данных

class DatabaseService {
  final String uid;
  DatabaseService({this.uid});

  //Collection reference
  final CollectionReference brewCollection =
      Firestore.instance.collection('brews');

  Future updateUserData(String sugars, String name, int strength) async {
    return await brewCollection.document(uid).setData({
      'sugars': sugars,
      'name': name,
      'strength': strength,
    });
  }

  //brew list from snapshot
  List<Brew> _brewListFromSnapshot(QuerySnapshot snapshot) {
    return snapshot.documents.map((doc) {
      return Brew(
        name: doc.data['name'] ?? '',
        strength: doc.data['strength'] ?? 0,
        sugars: doc.data['sugars'] ?? '0',
      );
    }).toList();
  }

  //userData from snapshot
  UserData _userDataFromSnapshot(DocumentSnapshot snapshot) {
    return UserData(
      uid: uid,
      name: snapshot.data['name'],
      sugars: snapshot.data['sugars'],
      strength: snapshot.data['strength'],
    );
  }

  //Get the collection stream
  Stream<List<Brew>> get brews {
    return brewCollection.snapshots().map(_brewListFromSnapshot);
  }

  //get user doc stream
  Stream<UserData> get userData {
    return brewCollection.document(uid).snapshots().map(_userDataFromSnapshot);
  }
}

Код аутентификации:

class Authenticate extends StatefulWidget {
  @override
  _AuthenticateState createState() => _AuthenticateState();
}

class _AuthenticateState extends State<Authenticate> {
  bool showSignIn = true;
  void toggleView() {
    setState(() {
      showSignIn = !showSignIn;
    });
  }

  @override
  Widget build(BuildContext context) {
    if (showSignIn) {
      return SignIn(toggleView: toggleView);
    } else {
      return Register(toggleView: toggleView);
    }
  }
}

1 Ответ

1 голос
/ 24 января 2020

Ваши правила верны, а ваша функция обновления верна. Ваш код аутентификации не показывает нам, если вы выполняете авторизацию через firebase auth.

Единственное, что может помешать его работе, это если вы не авторизованы (аутентифицированы через firebase аутентификацию) ИЛИ вы передали неверный Строка uid для вашего DatabaseService класса. Если это так, у вас не будет request.auth.uid, поэтому правило не будет выполнено.

Вы можете проверить свои правила в консоли или попытаться выделить точную полезную нагрузку в своем коде, чтобы предоставить нам больше информации.

...