Правила безопасности Firestore, предотвращающие прослушивание

Возникла проблема, из-за которой правила безопасности firestore блокируют мои слушатели в реальном времени

Вот правила безопасности:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      function isAdmin(uid) {
        return get(/databases/$(database)/documents/employees/$(uid)).data["Type"] == "Admin";
      }
      match /transactions/{transactionID} {
        //allow transaction if admin or if the user making the request is the EID of the relevant assignment
        allow read, create: if isAdmin(request.auth.uid) ||
            get(/databases/$(database)/documents/assignments/$(resource.data.assignment)).data.EID == request.auth.uid;
      }
      match /threads/{threadID} {
        allow read, write: if resource.data.Parties[0] == request.auth.uid ||
        resource.data.Parties[1] == request.auth.uid;
      }
      match /sites/{siteID} {
        allow read;
      }
      match /employees/{employeeID} {
        allow read, write: if isAdmin(request.auth.uid) ||
            (employeeID == request.auth.uid)
      }
      match  /employees/{employeeID}/EditHistory {
        allow read, write: if isAdmin(request.auth.uid) ||
            (employeeID == request.auth.uid)
      }
            match /employees/{employeeID}/Sessions {
        allow read, write: if isAdmin(request.auth.uid) ||
            (employeeID == request.auth.uid)
      }
      match /directory/{any} {
        allow read;
      }
      match /assignments/{assignmentID} {
        allow read, write: if isAdmin(request.auth.uid) ||
            get(/databases/$(database)/documents/assignments/$(assignmentID)).data.EID == request.auth.uid;
      }
      match /analytics {
        allow read: if isAdmin(request.auth.uid);
      }
    }
  }
}

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

Вот пример запроса, который я пытаюсь выполнить.

firebase.auth().onAuthStateChanged(user => {
            if (user) {

                unsubscribeTimetrackingListener = firebase.firestore().collection('employees').doc(currentUser.uid).collection("Sessions").where("Date", "= = ", generateDateStr(0))
                    .onSnapshot((querySnapshot) => {
                        fetchHistory();
                    }, (err) => {
                        console.error("Timetracking Listener Error: ", err);
                    })
            }
        });

Могу ли я предпринять какие-либо шаги, чтобы попытаться отладить причину блокировки слушателей?

Спасибо.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
22
1

Ответы 1

Я бы написал ваши вложенные правила безопасности так:

     match /employees/{employeeID} {
        allow read, write: if isAdmin(request.auth.uid) ||
            (employeeID == request.auth.uid)

        match  /EditHistory/{history} {
          allow read, write: if isAdmin(request.auth.uid) ||
              (employeeID == request.auth.uid)
        }

        match /Sessions/{session} {
        allow read, write: if isAdmin(request.auth.uid) ||
            (employeeID == request.auth.uid)
        }
      }

В общем, предоставление доступа к документам ОСОБЕННО ДЛЯ ЭТОГО УРОВНЯ - оно НЕ расширяется автоматически, чтобы разрешить дочерние уровни. Вложенные правила выше добавляют доступ к вложенным коллекциям.

Вы также можете написать:

      match /employees/{employeeID} {
        allow read, write: if isAdmin(request.auth.uid) ||
            (employeeID == request.auth.uid)
      }

      match  /employees/{employeeID}/EditHistory{histories} {
        allow read, write: if isAdmin(request.auth.uid) ||
            (employeeID == request.auth.uid)
      }

            match /employees/{employeeID}/Sessions/{sessions} {
        allow read, write: if isAdmin(request.auth.uid) ||
            (employeeID == request.auth.uid)
      }

[обратите внимание на добавление {историй} и {сессий}]

Я бы проверил isAdmin после проверки, совпадает ли userId, чтобы вы могли сократить поиск в базе данных.

samthecodingman 07.04.2021 10:03

Другие вопросы по теме