Невозможно основать условие правила безопасности на данных ресурса в Firebase

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

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

введите здесь описание изображения

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

введите здесь описание изображения

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

введите здесь описание изображения

Мне нужно вернуть один документ, но каждый раз, когда я запрашиваю документы с этим пользователем, вошедшим в систему (для этих целей я использую 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 или не указываю мне место, где может быть проблема?


person Dan Macák    schedule 05.05.2018    source источник


Ответы (1)


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

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

firebase.auth().signInWithEmailAndPassword("[email protected]", "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, вы получите точную ошибку, которую получаете

person Renaud Tarnec    schedule 05.05.2018
comment
Вы абсолютно правы, мне очень не хватало этого. Ваше решение мне подходит. Спасибо!. - person Dan Macák; 05.05.2018
comment
Есть ли способ использовать это правило без запросов? Я обращаюсь к документу напрямую по ссылке и слушаю его обновления, поэтому не хочу get() его значение. Это правило идеально подходит мне, но похоже, что я не могу его использовать, если собираюсь получить только один документ sigle по его идентификатору. - person Leonardo Rick; 31.08.2020