firestore: PERMISSION_DENIED: відсутні або недостатні дозволи


119

Я отримую Помилку

getdocuments.com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: відсутні або недостатні дозволи.

для коду нижче в операторі else

db.collection("users")
    .get()
    .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
             if (task.isSuccessful()) {
                 for (DocumentSnapshot document : task.getResult()) {
                     s(document.getId() + " => " + document.getData());
                 }
             } else {
                 s("Error getting documents."+ task.getException());
             }
         }
     });

Користувач увійшов?
Suhayl SH

4
Ви встановили правила на вкладці Безпека в консолі Firebase?
Suhayl SH

1
Моя помилка, я не побачив ящик для хмарного каміну. Я перевіряв лише в базі даних в реальному часі.
S Реху

дякую @SuhaylSH
S Rekhu

Відповіді:


174

Це просто працює для мене.

Перейдіть у базу даних -> Правила ->

Зміна allow read, write: if помилкової; до правдивого;

Примітка. Це повністю вимикає безпеку для бази даних!

Зробити це в світі для запису без автентифікації !!! Це НЕ рішення, яке рекомендувати для виробничого середовища. Використовуйте це лише для тестування.


44
Зауважте, це дозволяє кожному читати, писати вашу базу даних без будь-якого дозволу.
Sai Gopi Me

104
Це жахливе рішення, це буквально просто відключає безпеку. Перейдіть замість цього: firebase.google.com/docs/firestore/security/get-started
Duncan Luk

2
@ojonugwaochalifu, тому що це працює для всіх
Luvnish Monga

11
Як сказав @DuncanLuk, це жахливе рішення. Я б навіть не називав це рішенням
Ojonugwa Jude Ochalifu

6
Найкраще рішення, щоб почати дійсно швидко. Побоювання щодо безпеки могли бути вирішені пізніше фактично.
В’ячеслав Добромислов

79

Перейдіть до бази даних -> Правила :

Потім змінено нижче правил

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

внизу

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

9
Це погана ідея, це робить ВСІ документи, які можна записати будь-яким автентифікованим користувачем, навіть речі, які належать іншим користувачам, речі, які повинні бути доступними лише для адміністратора або взагалі ніколи не підлягали написанню. Будь ласка, зберігайте перший фрагмент коду, оскільки це захист від невтілених правил безпеки.
Noxxys

1
Зауважте, що якщо ви дозволите людям зареєструватися (наприклад, з Google SSO), вони автоматично отримають доступ до всіх ваших даних.
ForrestLyman

2
Я хочу дозволити своїм автентифікованим користувачам (невелика кількість) отримати доступ до всіх документів, тому цей рецепт ідеально підходить для мого випадку.
AFD

1
Це має бути прийнятою відповіддю.
Ішаан

19

Тож у моєму випадку у мене були такі правила БД:

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

Як бачите, uidна storyдокументі є поле для позначення власника.

Потім у своєму коді я запитував усі історії (Flutter):

Firestore.instance
          .collection('stories')
          .snapshots()

І це не вдалося, тому що я вже додав кілька історій через різних користувачів. Щоб виправити це, потрібно додати умову до запиту:

Firestore.instance
          .collection('stories')
          .where('uid', isEqualTo: user.uid)
          .snapshots()

Детальніше тут: https://firebase.google.com/docs/firestore/security/rules-query

РЕДАКТУВАТИ: за посиланням

Правила не є фільтрами При написанні запитів для отримання документів пам’ятайте, що правила безпеки не є фільтрами - запити - це все або нічого. Щоб заощадити ваш час та ресурси, Cloud Firestore оцінює запит по потенційному набору результатів замість фактичних значень поля для всіх ваших документів. Якщо запит потенційно може повернути документи, які клієнт не має дозволу на читання, весь запит не працює.


що таке об’єкт користувача?
Фані Рітвій

Це найкраща відповідь
Елія Вайс

12

Наведені вище відповіді небезпечні для здоров’я вашої бази даних. Ви все ще можете зробити свою базу даних доступною лише для читання, а не для написання:

  service cloud.firestore {
    match /databases/{database}/documents {
     match /{document=**} {
       allow read: if true;
       allow write: if false;
      }
   }
}

1
який правильний спосіб включення дозволів, але не для всіх?
nyxee

8

Якщо ви спробуєте в додатку Java Swing.

  1. Перейти до Firebase Console> Project Overview>Project Settings

  2. Потім перейдіть на вкладку "Облікові записи служби" та натисніть кнопку "Створити новий приватний ключ".

  3. Ви отримаєте файл .json, помістіть його у відомий шлях

  4. Потім перейдіть до "Властивості мого комп'ютера", "Додаткові параметри системи", "Змінні середовища".

  5. Створіть нове GOOGLE_APPLICATION_CREDENTIALSзначення змінної контуру за допомогою шляху до файлу json.


Це було і моїм питанням, для цього є інформація про документи .
tris timb

5

npm я - зберегти базу даних @ кутова / вогонь

у програмі app.module переконайтесь, що ви імпортували

import { AngularFireModule } from '@angular/fire';
import { AngularFirestoreModule } from '@angular/fire/firestore';

в імпорті

AngularFireModule.initializeApp(environment.firebase),
    AngularFirestoreModule,
    AngularFireAuthModule,

у правилах бази даних в реальному часі переконайтеся, що у вас є

{
  /* Visit  rules. */
  "rules": {
    ".read": true,
    ".write": true
  }
}

у правилах хмарних файлів переконайтеся, що у вас є

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

3

переконайтеся, що Ваша БД не порожня, а Ваш запит не для колекції, яких не існує


8
Цей виняток не має нічого спільного з порожньою колекцією або db, це питання з дозволом
Ojonugwa Jude Ochalifu

Цей виняток не має нічого спільного з порожнім Db і т. Д. Проблема з правилами безпеки та Auth.
Рехан Алі

Я та принаймні 3 інші мають цей виняток із цього сценарію. Якщо це не допоможе вам, перейдіть до наступного рішення
itzhar

3

Крім того, ви можете отримати цю помилку, якщо посилання на колекцію з вашого коду не відповідає назві колекції на firebase.

Наприклад, ім'я колекції на firebase є users, але ви посилаєтесь на db.collection("Users")абоdb.collection("user")

Він також враховує регістри.

Сподіваюся, що це комусь допоможе


Чи колекція не створена неявно? У вашому прикладі колекція "Користувачі" та "Користувач" створюватиметься як і коли на неї посилається.
bdev TJ

Інформацію можна знайти тут. codelabs.developers.google.com/codelabs/firestore-android/#3
bdev TJ

@DevTJ ви маєте рацію, коли це запит addабо setзапит, але з питання це getзапит. Я відчув це раніше
Анга


2

Якщо хтось приземлився тут, намагаючись отримати доступ до Firestore за допомогою облікового запису послуги:

Я вирішив це питання, надавши Service Account Userролі облікового запису служби на додаток до Cloud Datastore Userролі в налаштуваннях IAM GCP.


2

У цей час, червень 2020 року, за замовчуванням вогнева база визначається часом. Визначте час для задоволення своїх потреб.

allow read, write: if request.time < timestamp.date(2020, 7, 10);

Зверніть увагу: ваша БД все ще відкрита для будь-кого. Я пропоную, будь ласка, прочитайте документацію та налаштуйте БД так, як вам корисно.


1

проблема полягає в тому, що ви намагалися прочитати або записати дані в базу даних в реальному часі або в firestore до того, як користувач отримав автентифікацію. будь ласка, спробуйте перевірити сферу дії вашого коду. сподіваюся, що це допомогло!



1

Для мене це було питання з датою. Оновили його і питання було вирішено.

Дозволити читання / запис:

 if request.time < timestamp.date(2020, 5, 21);

Редагувати: Якщо ви все ще плутаєтесь і не можете зрозуміти, у чому проблема, просто перегляньте розділ правил на консолі Firebase.


1

обмеження часу може бути перевищено

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    // This rule allows anyone on the internet to view, edit, and delete
    // all data in your Firestore database. It is useful for getting
    // started, but it is configured to expire after 30 days because it
    // leaves your app open to attackers. At that time, all client
    // requests to your Firestore database will be denied.
    //
    // Make sure to write security rules for your app before that time, or else
    // your app will lose access to your Firestore database
    match /{document=**} {
      allow read, write: if request.time < timestamp.date(2020,7, 1);
    }
  }
}

там змінити дату в даний час в цьому рядку:

 allow read, write: if request.time < timestamp.date(2020,7, 1);


-1

Ваші правила повинні бути такими як для цього випадку, проте в повідомленні сказано, що це не запропонований спосіб, але якщо ви це зробите, ви можете робити вставки без помилки дозволу

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.