Разрешения группы сбора для Firestore - PullRequest
0 голосов
/ 26 мая 2019

У меня есть следующие правила:

match /suuntoAppAccessTokens/{userName} {
      allow create: if request.auth.uid != null && request.auth.token.firebase.sign_in_provider != 'anonymous';
      match /tokens/{userID} {
        allow read, write, create, update, delete: if request.auth.uid == userID && request.auth.token.firebase.sign_in_provider != 'anonymous';
      }
    }

match /{path=**}/tokens/{userID} {
            allow read, write, create, update, delete: if request.auth.uid == userID;
    }

Это означает, что для пути /suuntoAppAccessTokens/dimitrioskanellopoulos/tokens/{userID} текущий пользователь должен иметь доступ.

Однако, когда я запрашиваю группу сбора следующим образом:

return this.afs.collectionGroup('tokens').snapshotChanges();

, я получаю ошибку разрешения.

Получение документа непосредственно под tokes / {userID} работает как положено.

Что я могу сделать, чтобы текущий пользователь мог выполнить запрос collectionGroup и получить элементы, которые ему разрешено получать на основе моих правил?

1 Ответ

2 голосов
/ 26 мая 2019

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

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

Вам нужно будет изменить запрос так, чтобы клиент запрашивал только те документы, которые, как ожидается, будут доступны для чтения текущему пользователю. К сожалению, я не могу сказать, возможно ли это с вашей текущей схемой. Идентификатор документа {userId} нельзя использовать в запросе группы сбора для фильтрации документов. Итак, оба вы должны убедиться, что оба из следующих критериев выполнены:

  • Вам понадобится поле в документе, которое вы можете отфильтровать, чтобы выполнить эту работу.
  • Вам нужно будет скорректировать правило безопасности, чтобы оно точно соответствовало тому, о чем просит клиент.

Я предлагаю сохранить uid пользователя в документе с токеном, аналогично {userId} в правиле. Вы можете запросить это так:

collectionGroup('tokens').where("uid", "==", uid)

Убедитесь, что клиент правильно передает uid

Кроме того, вам необходимо убедиться, что правило предоставляет доступ по точному тем же критериям:

match /{path=**}/tokens/{userID} {
  allow read, write, create, update, delete:
    if request.auth.uid == resource.data.uid;
}

Это разрешит доступ к документу только в том случае, если его поле uid совпадает с идентификатором авторизации, что именно то, что запрашивает клиент.

...