Firestore: PERMISSION_DENIED: Отсутствующие или недостаточные разрешения
Я получаю сообщение об ошибке
gettingdocuments.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());
}
}
});
Ответы
Ответ 1
Примечание: это полностью отключает безопасность базы данных, делая ее доступной для записи без аутентификации !!! Это НЕ решение рекомендовать.
Это просто работает для меня.
Зайдите в базу данных → Правила ->
Изменить allow read, write: if
false; к истине;
Ответ 2
Перейти в базу данных → Правила:
Затем изменились ниже правила
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;
}
}
}
Ответ 3
убедитесь, что ваша БД не пуста или ваш запрос предназначен для коллекции, которой не существует
Ответ 4
Так что в моем случае у меня были следующие правила БД:
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
}
}
}
Как видите, в документе story
есть поле uid
для пометки владельца.
Затем в своем коде я опрашивал все истории (Флаттер):
Firestore.instance
.collection('stories')
.snapshots()
И это не удалось, потому что я уже добавил несколько историй от разных пользователей.
Чтобы это исправить, нужно добавить условие к запросу:
Firestore.instance
.collection('stories')
.where('uid', isEqualTo: user.uid)
.snapshots()
Подробнее здесь: https://firebase.google.com/docs/firestore/security/rules-query
Ответ 5
Кроме того, вы можете получить эту ошибку, если ссылка на коллекцию из вашего кода не совпадает с именем коллекции в firebase.
Например, имя коллекции в firebase - users
, но вы ссылаетесь на нее с помощью db.collection("Users")
или db.collection("user")
Это также чувствительно к регистру.
Надеюсь, это поможет кому-то
Ответ 6
Если вы попробуете в Java Swing Application.
Перейдите в консоль Firebase> Обзор проекта> Настройки проекта
Затем перейдите на вкладку "Учетные записи служб" и нажмите "Создать новый закрытый ключ".
- Вы получите файл .json, поместите его по известному пути
- Затем перейдите в "Свойства моего компьютера", "Дополнительные параметры системы", "Переменные среды".
- Создайте новую переменную пути "GOOGLE_APPLICATION_CREDENTIALS" со своим путем к файлу json.
Ответ 7
Вышеупомянутые проголосовавшие ответы опасны для здоровья вашей базы данных. Вы все еще можете сделать свою базу данных доступной только для чтения, а не для записи:
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read: if true;
allow write: if false;
}
}
}
Ответ 8
ВНИМАНИЕ: Это дает всем (даже не прошедшим проверку подлинности пользователям) доступ на чтение и запись ко всем вашим базам данных. Наверное, не то, что вы хотите!
Зайдите в базу данных → Правила ->
и сделать это
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write;
}
}
}