Firebase FireStore правила аутентифицированный доступ ко всем коллекциям, кроме одного - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть следующая структура пожарного хранилища, в основном 3 коллекции

publicdata protecteddata1 protecteddata2

Я хочу иметь защищенные данные 1 и защищенные данные 2, и действительно всю базу данных пожарного хранилища только для аутентифицированных пользователей. Но я хочу, чтобы publi c имел доступ только для чтения к коллекции 'publicdata' ..

Вот моя попытка, но она не работает

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read;
      allow write: if (request.auth.uid != null);
    }
    match /publicdata {
       allow read;
    }
  }
}
.

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Вы можете использовать следующие функции, которые я создал, чтобы сделать это

function isUserAuthenticated() {
    return request.auth.uid != null; 
}

Затем вы можете использовать его так:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if isUserAuthenticated();
    }

    match /publicdata/{itemId} {
      allow read : if true;
      allow create : if isUserAuthenticated();
      allow update: if isUserAuthenticated();
      allow delete: if isUserAuthenticated();
    }

    /* Functions */
    function isUserAuthenticated() {
      return request.auth.uid != null; 
    }
  }
}   

Принять как ответ, если он работает для вы. Доступно для большего количества вопросов в комментариях.

1 голос
/ 01 апреля 2020

Рекурсивный подстановочный знак здесь разрешает доступ ко всем коллекциям:

    match /{document=**} {
      allow read;
      allow write: if (request.auth.uid != null);
    }

Как только любое правило разрешает доступ к коллекции, этот доступ не может быть отменен любым другим правилом.

Что вы придется сделать, это вызвать каждую отдельную коллекцию в своем собственном правиле. Да, это какая-то боль, но это твой единственный вариант. Кроме того, читателю ваших правил становится очень ясно, что вы намерены разрешить для каждой коллекции.

Также стоит отметить, что это правило на самом деле ничего не делает, потому что оно не соответствует ни одному документу. :

    match /publicdata {
       allow read;
    }

Если вы хотите сопоставить документы в коллекции publicdata, требуется подстановочный знак, соответствующий документу в этой коллекции:

    match /publicdata/{id} {
       allow read;
    }

Помните, что правила соответствуют документы для доступа, а не коллекции.

...