Разрешения Cloud Firestore - PullRequest
       11

Разрешения Cloud Firestore

0 голосов
/ 04 января 2019

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

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{document=**} {
      allow read;
    }
    match /pages/{pageid} {

      // Returns true if the user is logged        
      function isSignedIn() {
        return request.auth != null;
      }

      // Returns true if the logged user is admin
      function isAdmin() {
        return isSignedIn()
            && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
      }

      // Returns true if the requested page has published marked as true (or should, at least :( )
      function isPublished() {
        return resource.data.published == true;
      }

      allow read: if isPublished() || isAdmin();
      allow write: if isAdmin();
    }
  }
}

Я не могу заставить isPublished() работать правильно. Контент отображается не так, как должно быть. isAdmin() работает правильно.

Мои данные имеют свойство published, настроенное как boolean, как и ожидалось, и все они, кроме одного, отмечены как true. Ничего не отображается, и эта ошибка появляется в браузере:

core.js:14597 ERROR Error: Missing or insufficient permissions.

У кого-нибудь есть идеи, как это исправить?

Кстати, мой код основан на документации: https://firebase.google.com/docs/firestore/security/rules-query#evaluating_constraints_on_queries

Вот пример данных, которые я пытаюсь прочитать: enter image description here

И конструктор моей Angular Service получает список страниц:

constructor(
  public afs: AngularFirestore) {   

    this.pagesCollection = this.afs.collection('pages', ref => ref.orderBy('order', 'asc'));

    this.pages = this.pagesCollection.snapshotChanges().pipe(
      map(changes => {
        return changes.map(a => {
          const data = a.payload.doc.data() as Page;
          data.id = a.payload.doc.id;
          return data;
        })
      })
    );
}

getPages(){
  return this.pages;   
}

1 Ответ

0 голосов
/ 04 января 2019

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

Это означает, что вам нужно будет копировать логику из вашего правила в запросе, запрашивая только опубликованные документы:

ref.where('published', '==', true).orderBy('order', 'asc')

Подробнее об этом см .:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...