firestore: PERMISSION_DENIED: разрешения отсутствуют или недостаточны


125

Я получаю ошибку

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 Rekhu 05

спасибо @SuhaylSH
S Rekhu 05

Ответы:


181

У меня это просто работает.

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

Изменить allow read, write: if false; к истине;

Примечание. Это полностью отключает безопасность базы данных!

Делаем его доступным для записи без аутентификации !!! Это решение НЕ рекомендуется для производственной среды. Используйте это только в целях тестирования.


44
обратите внимание, что он позволяет всем читать и писать вашу базу данных без какой-либо авторизации.
Саи Гопи Ме

109
Это ужасное решение, оно буквально отключает безопасность. Вместо этого прочтите это: firebase.google.com/docs/firestore/security/get-started
Дункан Лук,

2
@ojonugwaochalifu, потому что это работает для всех
Luvnish Monga

11
Как сказал @DuncanLuk, это ужасное решение. Я бы даже не назвал это решением
Оджонугва Джуд Очалифу

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), они автоматически получат доступ ко всем вашим данным.
ForrestLyman

2
Я хочу разрешить моим авторизованным пользователям (небольшому количеству) доступ ко всем документам, поэтому этот рецепт идеально подходит для моего случая.
AFD

20

Итак, в моем случае у меня были следующие правила БД:

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 сравнивает запрос с его потенциальным набором результатов, а не с фактическими значениями полей для всех ваших документов. Если запрос потенциально может вернуть документы, на чтение которых у клиента нет разрешения, то весь запрос не выполняется.


что такое пользовательский объект?
Фани Ритвидж

Это лучший ответ
Элиа Вайс

13

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

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

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

8

Если вы попробуете в Java Swing Application.

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

  2. Затем перейдите на вкладку «Учетные записи служб» и нажмите «Создать новый закрытый ключ».

  3. Вы получите файл .json, поместите его по известному пути

  4. Затем перейдите в «Свойства моего компьютера», «Дополнительные параметры системы», «Переменные среды».

  5. Создайте новое GOOGLE_APPLICATION_CREDENTIALSзначение переменной пути с вашим путем к файлу json.


Это тоже была моя проблема, есть информация об этом в документации .
Трис Тимб

5

npm i --save firebase @ angular / fire

в 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

убедитесь, что ваша БД не пуста и ваш запрос не предназначен для коллекции, которой не существует


9
Это исключение не имеет ничего общего с пустой коллекцией или db, это проблема с разрешением
Ojonugwa Jude Ochalifu

Это исключение не имеет ничего общего с пустым Db и т. Д. Проблема с правилами безопасности и Auth.
Рехан Али

У меня и еще как минимум трех человек есть это исключение в этом сценарии. Если это не поможет, переходите к следующему решению
итжар

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

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



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);

0

ПЕРЕЙДИТЕ к правилам в firebase и отредактируйте правила ..... (укажите метку времени или установите значение false) Мое решение.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.time < timestamp.date(2021, 8, 18);
    }
  }
}


-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.