Правило безопасности Firestore - {wildcard} не имеет значения NULL или NULL при получении коллекции - PullRequest
0 голосов
/ 09 апреля 2019

Я установил правило чтения в своем пожарном хранилище, и оно прекрасно работает, когда выполняется получение одного документа по идентификатору, но завершается ошибкой FirebaseError: Missing or insufficient permissions. при получении коллекции.

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

Данные (отформатированные, но, конечно, упорядоченные в коллекции / domument):

"items": {                   // collection "items"
   "item1" : {               // document "item1"
      "name": "first item"   // just dome dummy data
   }
}

правила:

service cloud.firestore {
    match /databases/{database}/documents {
        match /items/{itemId} {
            allow read: if itemId != null;
        }
    }
}

Код (машинопись) Я использую для доступа к базе данных

// This line works fine, returns the document
firebase.firestore().collection("/items").doc("item1").get()

// This line gets a "FirebaseError: Missing or insufficient permissions." error
firebase.firestore().collection("/items").get()

Я пытался изменить правило на

allow read: if itemId != null || itemId == null;

Что по логике должно быть всегда верно.Тем не менее, результаты все те же, что позволяет мне полагать, что есть некоторые проблемы с привязкой к шаблону itemId.

Так же, как проверка работоспособности, я также изменил правило на

allow read: if true;

А теперь и get() в коллекции, и в документе работает нормально (как и ожидалось), без каких-либо ошибок разрешения.

Итак, я что-то здесь упускаю, или это ошибка в firestore ??

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

Прежде всего, ваше правило не имеет смысла для меня.Какова цель проверки, если идентификатор документа не null?Нет никакого способа, которым у действительного документа будет null идентификатор документа.


С Запросы и правила безопасности :

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

В вашем случае существует вероятность того, что firestore посчитает, что ваш запрос потенциально может вернуть документы, которые у вас могут отсутствовать.разрешение на чтение.Он почему-то думает, что некоторые документы могут иметь null идентификатор документа, что отклоняет весь запрос.

Когда вы изменяете правило на allow read: if true;, оно работает, потому что Firestore проверило его и знает, что правилоопределенно пройдет для каждого отдельного документа, поэтому предоставит вам доступ для чтения.

0 голосов
/ 09 апреля 2019

Правило, которое вы предлагаете, не работает, потому что (как оно реализовано в настоящее время) переменная с подстановочными знаками имеет неопределенное значение для запросов типа списка (запроса) (но не для запросов типа get, поскольку идентификатор документа имеет конечно исходящий непосредственно от клиента). Запросы могут совпадать с несколькими документами, и в вашем запросе не указан идентификатор документа, поэтому его нельзя использовать в правиле.

Если вы когда-нибудь ожидали, что правило для каждого документа определит, принадлежит ли оно в результатах запроса, оно также никогда не сработает. Это потому, что правила не являются фильтрами. Все фильтры должны прийти от клиента. Если любой документов, которые могут существовать для данных фильтров, будет отклонен правилом, тогда весь запрос будет отклонен. (Фактически невозможно масштабировать проверку всех документов во время запросов - это может быть невероятно медленным).

Другими словами, не используйте подстановочную переменную, если вы хотите повлиять на запросы. Используйте только те свойства документов, которые могут совпадать, и убедитесь, что клиент указывает все соответствующие фильтры.

...