Невозможно основать условие правила безопасности на данных ресурса в Firebase - PullRequest
0 голосов
/ 05 мая 2018

Я пытаюсь сделать очень простую вещь, которая сопоставляет request.auth.uid со значением поля в моих транзакциях документов (например, resource.data.useruid) в правиле безопасности Firebase, чтобы получать транзакции определенного зарегистрированного в пользователя. Однако я не получаю никаких документов при запросе к ним и вместо этого получаю сообщение об ошибке.

Так выглядит коллекция - там только один документ с полем useruid.

enter image description here

Значение поля сопоставляется с пользователями uid (снимок экрана, сделанный на вкладке Аутентификация -> Пользователи .

enter image description here

И правило выглядит так

enter image description here

Я должен получить один документ обратно, но каждый раз, когда я запрашиваю документы, когда этот пользователь вошел в систему (я использую angularfire2 для этих целей), я получаю Error: Missing or insufficient permissions.

Если я изменяю условие правила, чтобы оно всегда возвращало true, или если я проверяю только на достоверность request.auth.uid, я получаю результат запроса в порядке. Забавно то, что с участием resource.data - например. проверка значения поля amount в правиле firebase - условие никогда не выполняется. Я пытался написать это как

allow read, write: if resource.data.amount == 3

и снова получил ошибку. Похоже, я вообще не получаю карту resource.data.

Я чувствую, что упускаю что-то очевидное, хотя после прочтения руководств мне кажется, что все в порядке, и у меня уже нет идей. Возможности отладки (или их отсутствие) делают весь процесс очень медленным.

Не могли бы вы объяснить мне, почему я не получаю карту resource.data в правиле безопасности firebase, или укажите, где может быть проблема?

1 Ответ

0 голосов
/ 05 мая 2018

Скорее всего, вы пропустили одну конкретную точку в документе: ваш запрос не выполняется «потому что он не включает в себя те же ограничения, что и ваши правила безопасности». Смотри https://firebase.google.com/docs/firestore/security/rules-query#secure_and_query_documents_based_on_authuid

Следующее, с вашими правилами безопасности работает отлично:

firebase.auth().signInWithEmailAndPassword("xxxx@xxxx.com", "xxxxx")
    .then(function (info) {
        db.collection("transactions").where("userid", "==", info.uid).get().then(function(querySnapshot) {
            querySnapshot.forEach(function(doc) {
                console.log(doc.id, " => ", doc.data());
            });
        });

    });

Если вы удалите предложение where, вы получите точную ошибку, которую получаете

...