#firebase #google-cloud-firestore #firebase-authentication #firebase-security
#firebase #google-cloud-firestore #firebase-аутентификация #firebase-безопасность
Вопрос:
У меня есть облачный firestore. В этом магазине у меня есть коллекции всех администраторов. Все данные из хранилища могут быть прочитаны кем угодно, но записи должны быть ограничены администраторами. Если кто-то пытается выполнить запись в коллекцию, например, latest-news, я хочу посмотреть, является ли пользователь, который пытается выполнить запись в коллекцию, администратором. Идея, которую я хочу, примерно такова:
match /latest-news/{news-id} {
allow read: if true;
allow write: if <my-admin-collection>.map(auth => auth.uid).includes(request.auth.uid);
}
Как бы я на самом деле это сделал?
Ответ №1:
Если ваша коллекция администраторов хранит этих администраторов по их UID, вы можете проверить наличие такого документа из ваших правил с помощью:
if exists(/databases/$(database)/documents/admins/$(request.auth.uid));
Вышеуказанное разрешает операцию, если в /admins
коллекции существует документ с UID текущего пользователя.
Также смотрите документацию по управлению доступом на основе атрибутов и ролей.
Комментарии:
1. Спасибо! Работает как шарм! Вы знаете, есть ли какой-либо способ доступа к полям в документе? Например. если значение в документе определяет, может ли пользователь, который пытается записать, сделать это?
2. Если вы проверите ссылку на документацию, она делает именно это: она использует поле из документа для определения роли.
3. Было поздно, когда я прочитал ваш ответ, лол. Спасибо, Фрэнк!
Ответ №2:
Все зависит от того, как вы определяете роли. В firebase роли авторизации могут быть настроены с помощью пользовательских утверждений.
Пользовательские утверждения могут использоваться при написании правил безопасности, таких как
match /latest-news/{news-id} {
allow write: if request.auth.token.role == 'Admin';
}
Приведенное выше правило безопасности позволит пользователю с ролью администратора выполнять запись в коллекцию только.