Правила облачного хранилища firestore — как мне просмотреть права пользователей при доступе к различным коллекциям в хранилище?

#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';
}
  

Приведенное выше правило безопасности позволит пользователю с ролью администратора выполнять запись в коллекцию только.