Я использую облачную базу данных Firestore, и у меня есть коллекция 'users' в моей базе данных root, и в ней находятся все пользовательские документы (называемые uid) и внутри них собираемые мной данные. Я хотел, чтобы пользователи могли только читать / писать в свои коллекции, поэтому я начал свои правила безопасности с
service cloud.firestore {
match /databases/{database}/documents {
// Allow only authenticated content owners access
match /users/{userId}/{documents=**} {
allow read, write: if request.auth.uid == userId
}
}
}
, после чего я понял, что пользователи не имеют разрешения создать свой собственный основной документ (он создал его как «призрачный» документ). Я также хочу добавить к нему данные, такие как отображаемое имя и адрес электронной почты, поэтому я добавил
// Allow users to read/write their own main user object
match /users/{userId} {
allow read, write: if request.auth.uid == userId
}
, все работает хорошо, но теперь я хочу разрешить администраторам читать / записывать все коллекции и документы пользователя. Документация Firebase предлагает добавить значение ключа к документу пользователя, например (admin:true)
, поэтому редактирование моих правил безопасности должно быть таким же:
match /users/{userId}/{documents=**} {
allow read, write: if request.auth.uid == userId
allow read, write: if get(/users/$(request.auth.uid)).data.admin == true; //-security breach?
}
, но не делает этого создает брешь в системе безопасности, когда пользователь может технически обновить свой собственный документ с помощью (admin:true)
и получить права администратора? если да, то я предполагаю, что мой подход должен создать отдельную коллекцию admins
и добавить туда моих администраторов, а затем сделать что-то в строках
allow read, write: if get(/admins/$(request.auth.uid)) != null
? или я могу использовать что-нибудь красивее?