INTERMITTENT FirebaseFirestoreException: PERMISSION_DENIED: отсутствуют или недостаточные разрешения - PullRequest
0 голосов
/ 28 марта 2019

У меня есть приложение для Android с PeriodicWork, которое записывает данные в Firestore каждые 30 минут. Работает нормально, но я заметил, что в некоторых случаях происходит сбой за исключением FirebaseFirestoreException: PERMISSION_DENIED. Я не понимаю, почему он жалуется на разрешение, если он может записывать данные в Firestore.

// Firestore Rules
service cloud.firestore {
  match /databases/{database}/documents {

    match /bar/{document=**} {
      allow read: if true;
      allow create: if true;
    }

  }
}
// Write to Firestore
val firebaseFirestore = FirebaseFirestore.getInstance()

firebaseFirestore.collection(BAR_KEY)
        .add(barData)
        .addOnSuccessListener { /*success callback*/ }
        .addOnFailureListener { e ->
            Crashlytics.log(e.message)
            Crashlytics.logException(e)
            /* failure callback */
        }
Non-fatal Exception: com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: Missing or insufficient permissions.
       at com.google.firebase.firestore.util.Util.exceptionFromStatus(com.google.firebase:firebase-firestore@@18.1.0:119)
       at com.google.firebase.firestore.core.SyncEngine.notifyUser(com.google.firebase:firebase-firestore@@18.1.0:446)
       at com.google.firebase.firestore.core.SyncEngine.handleRejectedWrite(com.google.firebase:firebase-firestore@@18.1.0:430)
       at com.google.firebase.firestore.core.FirestoreClient.handleRejectedWrite(com.google.firebase:firebase-firestore@@18.1.0:275)
       at com.google.firebase.firestore.remote.RemoteStore.handleWriteError(com.google.firebase:firebase-firestore@@18.1.0:707)
       at com.google.firebase.firestore.remote.RemoteStore.handleWriteStreamClose(com.google.firebase:firebase-firestore@@18.1.0:663)
       at com.google.firebase.firestore.remote.RemoteStore.access$600(com.google.firebase:firebase-firestore@@18.1.0:53)
       at com.google.firebase.firestore.remote.RemoteStore$2.onClose(com.google.firebase:firebase-firestore@@18.1.0:206)
       at com.google.firebase.firestore.remote.AbstractStream.close(com.google.firebase:firebase-firestore@@18.1.0:334)
       at com.google.firebase.firestore.remote.AbstractStream.handleServerClose(com.google.firebase:firebase-firestore@@18.1.0:388)
       at com.google.firebase.firestore.remote.AbstractStream$StreamObserver.lambda$onClose$3(com.google.firebase:firebase-firestore@@18.1.0:149)
       at com.google.firebase.firestore.remote.AbstractStream$StreamObserver$$Lambda$4.run(Unknown Source:4)
       at com.google.firebase.firestore.remote.AbstractStream$CloseGuardedRunner.run(com.google.firebase:firebase-firestore@@18.1.0:67)
       at com.google.firebase.firestore.remote.AbstractStream$StreamObserver.onClose(com.google.firebase:firebase-firestore@@18.1.0:135)
       at com.google.firebase.firestore.util.FirestoreChannel$1.onClose(com.google.firebase:firebase-firestore@@18.1.0:161)
       at io.grpc.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39)
       at io.grpc.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23)
       at io.grpc.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40)
       at io.grpc.internal.CensusStatsModule$StatsClientInterceptor$1$1.onClose(CensusStatsModule.java:678)
       at io.grpc.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39)
       at io.grpc.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23)
       at io.grpc.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40)
       at io.grpc.internal.CensusTracingModule$TracingClientInterceptor$1$1.onClose(CensusTracingModule.java:397)
       at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:459)
       at io.grpc.internal.ClientCallImpl.access$300(ClientCallImpl.java:63)
       at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.close(ClientCallImpl.java:546)
       at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.access$600(ClientCallImpl.java:467)
       at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:584)
       at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
       at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123)
       at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458)
       at java.util.concurrent.FutureTask.run(FutureTask.java:266)
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
       at com.google.firebase.firestore.util.AsyncQueue$DelayedStartFactory.run(com.google.firebase:firebase-firestore@@18.1.0:205)
       at java.lang.Thread.run(Thread.java:764)
Caused by io.grpc.StatusException: PERMISSION_DENIED: Missing or insufficient permissions.
       at io.grpc.Status.asException(Status.java:534)
       at com.google.firebase.firestore.util.Util.exceptionFromStatus(com.google.firebase:firebase-firestore@@18.1.0:117)
       at com.google.firebase.firestore.core.SyncEngine.notifyUser(com.google.firebase:firebase-firestore@@18.1.0:446)
       at com.google.firebase.firestore.core.SyncEngine.handleRejectedWrite(com.google.firebase:firebase-firestore@@18.1.0:430)
       at com.google.firebase.firestore.core.FirestoreClient.handleRejectedWrite(com.google.firebase:firebase-firestore@@18.1.0:275)
       at com.google.firebase.firestore.remote.RemoteStore.handleWriteError(com.google.firebase:firebase-firestore@@18.1.0:707)
       at com.google.firebase.firestore.remote.RemoteStore.handleWriteStreamClose(com.google.firebase:firebase-firestore@@18.1.0:663)
       at com.google.firebase.firestore.remote.RemoteStore.access$600(com.google.firebase:firebase-firestore@@18.1.0:53)
       at com.google.firebase.firestore.remote.RemoteStore$2.onClose(com.google.firebase:firebase-firestore@@18.1.0:206)
       at com.google.firebase.firestore.remote.AbstractStream.close(com.google.firebase:firebase-firestore@@18.1.0:334)
       at com.google.firebase.firestore.remote.AbstractStream.handleServerClose(com.google.firebase:firebase-firestore@@18.1.0:388)
       at com.google.firebase.firestore.remote.AbstractStream$StreamObserver.lambda$onClose$3(com.google.firebase:firebase-firestore@@18.1.0:149)
       at com.google.firebase.firestore.remote.AbstractStream$StreamObserver$$Lambda$4.run(Unknown Source:4)
       at com.google.firebase.firestore.remote.AbstractStream$CloseGuardedRunner.run(com.google.firebase:firebase-firestore@@18.1.0:67)
       at com.google.firebase.firestore.remote.AbstractStream$StreamObserver.onClose(com.google.firebase:firebase-firestore@@18.1.0:135)
       at com.google.firebase.firestore.util.FirestoreChannel$1.onClose(com.google.firebase:firebase-firestore@@18.1.0:161)
       at io.grpc.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39)
       at io.grpc.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23)
       at io.grpc.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40)
       at io.grpc.internal.CensusStatsModule$StatsClientInterceptor$1$1.onClose(CensusStatsModule.java:678)
       at io.grpc.PartialForwardingClientCallListener.onClose(PartialForwardingClientCallListener.java:39)
       at io.grpc.ForwardingClientCallListener.onClose(ForwardingClientCallListener.java:23)
       at io.grpc.ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose(ForwardingClientCallListener.java:40)
       at io.grpc.internal.CensusTracingModule$TracingClientInterceptor$1$1.onClose(CensusTracingModule.java:397)
       at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:459)
       at io.grpc.internal.ClientCallImpl.access$300(ClientCallImpl.java:63)
       at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.close(ClientCallImpl.java:546)
       at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl.access$600(ClientCallImpl.java:467)
       at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:584)
       at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
       at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123)
       at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458)
       at java.util.concurrent.FutureTask.run(FutureTask.java:266)
       at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
       at com.google.firebase.firestore.util.AsyncQueue$DelayedStartFactory.run(com.google.firebase:firebase-firestore@@18.1.0:205)
       at java.lang.Thread.run(Thread.java:764)

1 Ответ

0 голосов
/ 28 марта 2019

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

Измените add (barData) на set (barData, SetOptions.merge ())

И добавьте нижеследующую строку в ваши правила безопасности

allow update: if true;
...