Разрешения Firestore и правила для запросов к коллекциям (списку), которые принадлежат вошедшему в систему пользователю - PullRequest
0 голосов
/ 15 января 2019

Я создаю менеджер контактов, в котором у пользователя есть куча «контактов» в его адресной книге. Я только хочу, чтобы пользователь, создавший контакт, мог запросить этот контакт. Я написал запрос ниже, который говорит, что я хочу, чтобы он делал, но запрос не работает, и я не знаю почему.

Все контакты создаются с полем owner_id, которое соответствует uid пользователя, создавшего контакт.

service cloud.firestore {
  match /databases/{database}/documents {
    match /contacts/{contactId} {
          // only allow read for contacts if the current user is the owner
          allow read: if request.auth.uid == resource.data.owner_id // <-- this does not work
          allow write: if request.auth.uid != null && request.resource.data.owner_id != null;
    }
  }
}

Когда я запускаю запрос, я ничего не получаю обратно, и симулятор не позволяет мне выполнять запросы на list запросах для всей коллекции, только get для одного документа. Запрос просто:

db.collections('contacts')

Я также пытался ограничить использование выражения where:

db.collections('contacts').where('owner_id', '==', <hard-coded-owner-id>)

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

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

https://firebase.google.com/docs/firestore/security/get-started

1 Ответ

0 голосов
/ 15 января 2019

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

Я ожидаю, что ваш второй запрос будет работать, потому что он только получает доступ к документам, которые разрешены разрешениями. Тем не менее, он будет работать только тогда, когда эффективный UID, сообщаемый Firebase Authentication, совпадает с тем, который вы жестко закодировали. То, что вы проверяете по правилу, - то, что вошедший в систему пользователь только пытается прочитать документы там, где они присутствуют в owner_id. Если вы работаете в симуляторе консоли, вам нужно будет включить аутентификацию и указать правильный UID в форме.

...