Правила безопасности Firebase для ограничения доступа по всем путям, кроме одного? - PullRequest
0 голосов
/ 13 ноября 2018

Вопрос:

Для различных коллекций пожарных хранилищ верхнего уровня, приведенных ниже, как ограничить доступ ко всем путям, кроме одного?

Мы создаем схему данных в Firestore для поддержки приложения чата для учителей из нескольких школ.

Коллекции пожарных на высшем уровне включают в себя:

  • /siteAdminUsers
  • /schools
  • /schools/{schoolId}/teachers
  • /schools/{schoolId}/chats

Ниже приведена настройка правил безопасности, которую мы сейчас пытаемся - где мы проверяем:

  1. действительный пользователь auth
  2. ожидаемое значение существует в переменной userClaim request.auth.token.chatFlatList

Однако прослушиватель чтения для /messages блокируется.

Сообщение об ошибке:

FirebaseError: [code = access-denied]: отсутствуют или отсутствуют разрешения


service cloud.firestore {
  match /databases/{database}/documents {

    match /{document=**} {
      allow read, write: if false;
    }

    match /schools/{schoolId}/chats/{discussionId}/messages {
      allow write: if false;
      allow read: if request.auth != null
                  && request.auth.token != null
                  && request.auth.token.chatFlatList.val().contains($discussionId);
    }
}

Детали

Мы используем облачные функции для всех операций чтения / записи данных, поэтому практически в каждом случае мы можем просто заблокировать доступ всех клиентов.

Единственное исключение - обсуждения в чате, где нам нужно настроить прослушиватель снимков в мобильном клиенте, чтобы знать, когда появляются новые сообщения.

Примечания к подгруппе:

В школе проводятся дискуссионные сессии для школьного персонала (учителей, администраторов и т. Д.)

/schools/{schoolId}/chats/{discussionId}

Где каждый документ для обсуждения содержит:

  1. список учителей участников
  2. Подколлекция для фактических сообщений, где каждый документ является отдельным опубликованным сообщением:

/schools/{schoolId}/chats/{discussionId}/messages

Код заявки пользователя из облачной функции

Просматривая журналы облачных функций, мы убедились, что устанавливается userClaim.

return firebaseAdmin
    .auth()
    .setCustomUserClaims(
        uid, {
            chatFlatList: 'id1 id2 id3'
        }
    );

ОБНОВЛЕНИЕ # 1

Попробовал следующий вариант, где правила пропускают / опускают проверку userClaim и auth.token.

Однако, все еще та же ошибка разрешения.

service cloud.firestore {
  match /databases/{database}/documents {

        match /{document=**} {
          allow read, write: if false;
        }

        match /schools/{schoolId}/chats/{discussionId}/messages {
          allow write: if false;
          allow read: if request.auth != null;
        }

    }
}

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Вот решение (кажется, работает), которое включает проверку chatFlatList переменной заявки пользователя (из исходного вопроса) для подстроки:

        match /schools/{schoolId}/chats/{discussionId}/messages {
          allow write: if false;
          allow read: if request.auth != null
          && request.auth.token.chatFlatList.matches(discussionId);
        }

На рисунке этоспасибо:

  1. Правила хранения Firebase на основе пользовательских параметров

    • Здесь пост показывает, что не любая $ запись для доступа к пути var.Я помню, как видел это в правилах безопасности в примере кода - может быть, это специфично для уровней базы данных?
  2. https://firebase.google.com/docs/reference/security/storage/#string

  3. https://regex -golang.appspot.com / assets / html / index.html

    • Попробуем несколько примеров ввода здесь, чтобы понятьо том, как создать регулярное выражение.
0 голосов
/ 28 ноября 2018

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

Все операторы соответствия должны указывать на документы, а не на коллекции. https://firebase.google.com/docs/firestore/security/rules-structure

Вы должны попытаться добавить / {document = **} после вашего пути к сообщениям, что-то вроде:

    match /schools/{schoolId}/chats/{discussionId}/messages/{document=**} {
      allow write: if false;
      allow read: if request.auth != null;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...