Проблема с записью в правила Firestore вложенных коллекций

#firebase #security #google-cloud-firestore #firebase-security

#firebase #Безопасность #google-облако-firestore #firebase-безопасность

Вопрос:

У меня есть база данных 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. Как бы вы идентифицировали пользователя, который является «директором»? Все ли пользователи являются «директорами»? Что могут сделать пользователи, не являющиеся директорами? Не на 100% ясно, какие права доступа вы хотите реализовать.

2. Я могу определить директора, чего я не могу сделать, так это установить разрешение, как только учитель установлен, записывать в более глубокий документ на основе его пути, как я упоминал. Спасибо за ответ.

Ответ №1:

Из вашего вопроса я понял, что вы хотите предоставить read, write for /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 userid в качестве идентификатора документа и добавить 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