Проблема с записью в подколлекции Firestore Rules - PullRequest
0 голосов
/ 26 марта 2019

У меня есть база данных Firestore и она имеет следующую структуру:

collection (teachers): {
  doc (id): {
    name: name
    lastName: lastName
    collection (classes): {
      doc (id): {
        name: math
      }
    }
  }
}

Я пытаюсь добиться того, чтобы директор мог получить имя teacher и добавить / создать несколько классов для того же учителя. Проблема заключается в добавлении правил Firestore. Я испробовал три варианта правил, но ни один из них не сработал, как ожидалось. Я умел читать, но писать было невозможно.

1

service cloud.firestore {
  match /databases/{database}/documents {
    match /teachers/{teacher} {
        allow get if true;
        allow create if true;
    }
  }
}

2

service cloud.firestore {
  match /databases/{database}/documents {
    match /teachers/{teacher} {
        allow get if true;
    }
    match /teachers/{teacher}/classes/{class} {
    allow create if true;
  }
}

3

service cloud.firestore {
  match /databases/{database}/documents {
    match /teachers/{teacher} {
        allow get if true;
      match /classes/{class} {
        allow create if true;
      }
    }
}

Кстати, я работаю с angularfirestore2.

1 Ответ

2 голосов
/ 01 апреля 2019

Что я понял из вашего вопроса, так это то, что вы хотите дать read, write для /teachers/{teacher}/classes/{class} некоторым пользователям с ролью headmaster.

Для этого сначала вам нужно проверить, какие пользователи headmasters.

Если идентификатор документа вашего учителя совпадает с идентификатором пользователя, созданным в firebase auth, вы можете добавить поле данных в ваш документ учителя с именем isHM и установить его на true, если пользователь является директором:

collection (teachers): {
  doc (id): {
    name: name
    lastName: lastName
    isHM: true
    collection (classes): {
      doc (id): {
        name: math
      }
    }
  }
}

Теперь добавьте следующее правило:

service cloud.firestore {
   match /databases/{database}/documents {
     match /teachers/{teacher}/classes/{class} {

        function isHeadMaster() {
          return get(/databases/$(database)/documents/teachers/$(request.auth.uid)).data.isHM;
        }

        // HM can read, write classes
        allow read, write: if isHeadMaster == true;

     }
   }
}

, иначе вам нужно создать другую коллекцию с идентификатором пользователя firebase в качестве идентификатора документа и добавить поле isHM, если пользовательдиректор:

collection (headmasters): {
  doc (uid): {
    ----
    isHM: true
    ----
  }
}

, а затем добавьте следующее правило:

service cloud.firestore {
   match /databases/{database}/documents {
     match /teachers/{teacher}/classes/{class} {

        function isHeadMaster() {
          return get(/databases/$(database)/documents/headmasters/$(request.auth.uid)).data.isHM;
        }

        // HM can read, write classes
        allow read, write: if isHeadMaster == true;

     }
   }
}

Чтобы найти дополнительные правила доступа на основе ролей, установите флажок https://firebase.google.com/docs/firestore/solutions/role-based-access

...