Nano Hash - криптовалюты, майнинг, программирование

Правило базы данных Firebase не работает с чтением коллекции AngularFire

У меня следующее правило базы данных:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    function isAdmin() {
        return get(/databases/$(database)/documents/administrators/$(request.auth.uid)).data.admin == true;
    }
    match /users/{userId}/{document=**} {
      allow read: if request.auth.uid != null;
      allow write: if request.auth.uid == userId;
    }
    match /administrators/{document=**} {
      allow read, write: if isAdmin();
    }
    match /projects/{project} {
        function getRole(rsc) {
        return rsc.data.members[request.auth.uid];
        }
      allow create: if request.auth.uid != null;
      allow read: if request.auth.uid != null && ( getRole(resource) == 'owner' || getRole(resource) == 'participant' );
      allow write: if request.auth.uid != null && ( getRole(resource) == 'owner' );
    }
    match /statuses/{document=**} {
      allow read: if request.auth.uid != null;
      allow write: if isAdmin();
    }
  }

}

Когда я тестирую чтение документа коллекции проектов с аутентифицированным userId, все в порядке. Когда я пытаюсь прочитать ту же коллекцию с помощью AngularFire, я получаю сообщение об ошибке FirebaseError: Отсутствуют или недостаточны разрешения.

this.projectsCollection = this.afs.collection<Project>('/projects', ref =>
        ref.orderBy('projectId'));
this.projects = this.projectsCollection.valueChanges();
this.projects.subscribe(data => {
      this.isLoading = false;
    }, error => {
      this.isLoading = false;
      console.log(error);
    })

Не могли бы вы помочь мне определить ошибку? Спасибо


Ответы:


1

Я прочитал более подробно документацию, по этой ссылке я обнаружил проблему: https://firebase.google.com/docs/firestore/security/rules-conditions#rules_are_not_filters

Я изменил запрос, используя фильтр, и коллекцию, используя массив для членов вместо объекта карты:

this.projectsCollection = this.afs.collection<Project>('/projects', ref =>
        ref
          .where('members', 'array-contains', this.userUid)
          .orderBy('projectId'));

Теперь все работает нормально.

18.05.2020

2

Используйте поле members как часть вашего запроса:

this.projectsCollection = this.afs.collection<Project>('/projects', ref =>
        ref.where(`members.${this.userUid}`, 'in', ['owner', 'participant'])
        .orderBy('projectId'));

07.10.2020
Новые материалы

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

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..