В разрешении отказано при настройке firestore во флаттере - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь добавить правила безопасности в свое приложение с функцией firebase firestore, поэтому правила

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      function isSignedIn() {
        return request.auth.uid != null;
      }
    
      allow read, write: if isSignedIn() && request.auth.uid == resource.data.uid
    }
  }
}

, и это функция для получения снимка запроса

 Stream<QuerySnapshot>  diarySnapshot(String uid){

    return _firestore
        .collection(uid)
        .where('uid', isEqualTo:uid)
        .snapshots();

  }

, но я я получаю сообщение об ошибке

[Firestore]: Write failed at 2nVrS92SbOZocu2CJY3Tj68er1n2/rXZAWPxEqhtqwmOrtZfo: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}

Еще одна вещь, которую каждый пользователь будет иметь свою собственную коллекцию, названную по их идентификатору.

EDIT

** DatabaseService .dart **

class DatabaseService{


  Firestore _firestore=Firestore.instance;




  /*Future<void> configure() async{
    final FirebaseApp app=await FirebaseApp.configure(name:'notes',
      options: FirebaseOptions(
          googleAppID: '1:1051484666895:android:7e879575351f8463b2f77a',
          projectID: 'notes-e2864',
          gcmSenderID:'1051484666895',
          apiKey: 'AIzaSyBrCie0qxxwn0KwSLJ1wwTxnVZ7nLz-QkY'

      ),

    );
    _firestore = Firestore(app: app);
  }

*/

  Future setNewData(String uid,String title,String diary,DateTime dateTime) async{

    await _firestore.collection(uid).document().setData({

      'title':title,
      'diary':diary,
      'dateTime':dateTime.toString()
    });
  }

  Stream<QuerySnapshot>  diarySnapshot(String uid){

    return _firestore
        .collection(uid)
        .where('uid', isEqualTo:uid)
        .snapshots();

  }


}

Я пробовал как закомментированный, так и раскомментированный код, закомментированный сначала настраивался, а затем запускалась программа.

ServiceViewModel

class ServiceViewModel extends ChangeNotifier {




  final AuthService _authService=AuthService();
  final DatabaseService _databaseService=DatabaseService();
  String _uid;

  /*ServiceViewModel(){
    _databaseService.configure();
  }*/



  void signInWithEmailAndPassword(String email,String password) async {
     await _authService.signInWithEmailAndPassword(email, password);

   }

  void registerInWithEmailAndPassword(String email,String password) async {
     await _authService.registerWithEmailAndPassword(email, password);
  }

  void signInWithGoogle()async {
   await _authService.signInWithGoogle();
    print('Sign In With Google');
   }

  void signOut(){
     _authService.signOut();
     _uid=null;
   }

  /* void setUid() async{
     _uid=await _authService.getCurrentUser();

   }*/

   void setData(String title, String diary, DateTime dateTime) async{
     await _authService.getCurrentUser().then((value) async {
       return await _databaseService.setNewData(value.toString(), title, diary, dateTime);
     });

   }

   Stream<QuerySnapshot> getSnapShot(String uid)   {
     return _databaseService.diarySnapshot(uid);
   }


}


1 Ответ

3 голосов
/ 13 июля 2020

resource.data не существует на create, поэтому вы ошиблись.

Попробуйте вместо этого:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      function isSignedIn() {
        return request.auth.uid != null;
      }
    
      allow create: if isSignedIn() && request.auth.uid == request.resource.data.uid;
      allow update: if isSignedIn() && request.auth.uid == resource.data.uid
        && request.auth.uid == request.resource.data.uid;
      allow read, delete: if isSignedIn() && request.auth.uid == resource.data.uid
    }
  }
}

EDIT: специальный случай для обновления, чтобы не застрять

...