#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