Безопасность Firestore при получении документа по идентификатору запрещает разрешение

Когда я напрямую получаю документ с помощью .doc (). Get () firestore security rues deny permission. Что мне нужно сделать, чтобы разрешить операции CRUD для аутентифицированных пользователей моего Ionic-приложения? В моем приложении PWA Ionic есть следующая функция

``` async getUserProfile(): Promise<firebase.firestore.DocumentSnapshot> {
          const user: firebase.User = await this.authProvider.getUser();
          this.currentUser = user;
          console.log('found current user');
          this.userProfile = firebase.firestore().doc(`userProfile/${user.uid}`);
          console.log('returing userprofile', this.userProfile.get());
          return this.userProfile.get();
  }```

Но вызов this.userprofile.get () не выполняется из-за предупреждения системы безопасности из правил безопасности Firestore.

обнаружил, что текущий пользователь возвращается в профиль пользователя ZoneAwarePromise __zone_symbol__state: 0 __zone_symbol__value: FirebaseError: разрешения отсутствуют или недостаточны. в новом e (http: // localhost: 8100 / vendor.js: 92760: 23) по адресу http: // локальный: 8100 / vendor.js: 102987: 28. . . (http: // localhost: 8100 / polyfills.js: 10248: 56) код: запрещенное в разрешении имя: FirebaseError toString: ƒ () сообщение: разрешения отсутствуют или недостаточны. stack: FirebaseError: разрешения отсутствуют или недостаточны. \ n в новом e

Правила безопасности Firestore устанавливаются просто как

service cloud.firestore {
  match /databases/{database}/documents {
   match /userProfile/{userId}/{documents=**} {
      allow read, update, get,delete: if request.auth != null && request.auth.uid == userId;
      allow create: if request.auth != null;
    }
  }
} 

Какое должно быть правильное правило безопасности, которое позволит аутентифицированным пользователям использовать CRUD для своих документов? Или правильный способ получить документ из коллекции

ОБНОВЛЕНИЕ: он работает непосредственно из симулятора, но не из приложения  Снимок экрана для Симулятора правил. Он там работает


person Santosh Tamhane    schedule 28.05.2021    source источник


Ответы (2)


Некоторое вдохновение. Я использую этот очень простой доступ на основе ролей, чтобы разрешить чтение и запись там, где обычный пользователь может читать, а администраторы могут писать:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
        
      function googleProvider() {
        return request.auth.token.firebase.sign_in_provider == "google.com"; 
      }
      function getUserData() {
        return get(/databases/$(database)/documents/users/$(request.auth.uid)).data
      }
      allow read: if googleProvider() && getUserData().roles['user'] == true;      
      allow write: if googleProvider() && getUserData().roles['admin'] == true;
    }
  

} }

person voscausa    schedule 28.05.2021

Какие version правила безопасности у вас есть?

Для версии 1 есть подсказка:

По умолчанию правила безопасности используют версию 1. В версии 1 рекурсивные символы подстановки соответствуют одному или нескольким элементам пути. Они не соответствуют пустому пути, поэтому match / cities / {city} / {document = } соответствует документам в подколлекциях, но не в коллекции городов, тогда как match / cities / {document =} соответствует обоим документы в городском собрании и подколлекциях.

Это могло бы объяснить, почему вы не можете получить нужные данные.

Версия 2 ведет себя иначе:

В версии 2 правил безопасности рекурсивные символы подстановки соответствуют нулю или более элементам пути. match / cities / {city} / {document = **} соответствует документам в любых вложенных коллекциях, а также документам в коллекции городов.

Здесь вы можете увидеть весь документ по нему.

Версия должна быть поверх ваших правил, как здесь:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in the cities collection as well as any document
    // in a subcollection.
    match /cities/{city}/{document=**} {
      allow read, write: if <condition>;
    }
  }
}
person Tarik Huber    schedule 28.05.2021
comment
Я использовал правила версии 2. Извините, что не упомянул об этом раньше. Удивительно, но работает это напрямую с симулятора. Но не из приложения. Я обновил код вашей версией, но ошибка все еще возникает - person Santosh Tamhane; 28.05.2021