Firestore запрос в приложении дает разрешение отклонено, в то время как симулятор работает нормально - PullRequest
0 голосов
/ 29 июня 2018

В приложении Firestore я использую следующий запрос для получения некоторых данных:

FirebaseFirestore.getInstance().collection("events").document( eventId ).collection("instances").get().addOnCompleteListener( .... )

Это дает разрешение на отказ в стеке: FirebaseFirestoreException: PERMISSION_DENIED: Missing or insufficient permissions.

Соответствующая часть моих правил выглядит следующим образом:

match /events/{eventId} {

      allow create: if isCurrentUser( request.resource.data.owner );
      allow read: if isOwner(eventId) || isAnAdmin( eventId );
      allow update: if isOwner( eventId ) || isAtLeastEventAdmin( eventId );
      allow delete: if isOwner( eventId ); 

      match /instances/{instanceId} {
        allow read: if isOwner(eventId) || isAnAdmin( eventId );
        allow write: if isOwner( eventId ) || isAtLeastInstanceAdmin( eventId );
      }
    } 

Внутри консольного симулятора запрос для определенного экземпляра работает нормально, но как только я запускаю запрос к коллекции «экземпляров», я получаю эту проблему (это то, что я не могу симулировать в симуляторе). Обратите внимание, что isOwner( eventId ) возвращает true в этой ситуации.

Как включить запросы для экземпляров? По моему мнению, разрешения на чтение должно быть достаточно, чтобы разрешать запросы?

1 Ответ

0 голосов
/ 01 июля 2018

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

https://firebase.google.com/docs/firestore/security/rules-query

Следующее правило безопасности использует переменные request.auth и resource.data, чтобы ограничить права на чтение и запись для каждой статьи для ее автора:

service cloud.firestore {
  match /databases/{database}/documents {
    match /stories/{storyid} {
      // Only the authenticated user who authored the document can read or write
      allow read, write: if request.auth.uid == resource.data.author;
    }
  }
}

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

Неверно: ограничения запросов не соответствуют ограничениям правил безопасности

// Этот запрос не будет выполнен

db.collection("stories").get()

Запрос не выполняется, даже если текущий пользователь фактически является автором каждого исторического документа. Причина такого поведения заключается в том, что, когда Cloud Firestore применяет ваши правила безопасности, он оценивает запрос по его потенциальному набору результатов, а не по фактическим свойствам документов в вашей базе данных. Если запрос может содержать документы, нарушающие ваши правила безопасности, запрос завершится неудачей.

...