Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

Условия использования в правилах безопасности Firebase Cloud Storage

Это руководство опирается на выучить основной синтаксис языка правил Firebase безопасности руководства , чтобы показать , как добавить условия к вашим правилам Firebase безопасности для Cloud Storage.

Основной строительный блок облачных правил безопасности хранения является условием. Условие - это логическое выражение, которое определяет, следует ли разрешить или запретить конкретную операцию. Для основных правил, используя true и false литералы в условиях работы втирает хорошо. Но язык Firebase Security Rules for Cloud Storage дает вам возможность писать более сложные условия, которые могут:

  • Проверить аутентификацию пользователя
  • Проверить входящие данные

Аутентификация

Правила безопасности Firebase для облачного хранилища интегрируются с аутентификацией Firebase, чтобы обеспечить мощную аутентификацию на основе пользователей в облачном хранилище. Это позволяет осуществлять детальный контроль доступа на основе утверждений токена аутентификации Firebase.

Когда аутентифицированный пользователь выполняет запрос от Cloud Storage, то request.auth переменного заполняются пользователь uid ( request.auth.uid ), а также требования к Firebase аутентификация JWT ( request.auth.token ).

Кроме того, при использовании пользовательской аутентификации, дополнительные претензии всплыли в request.auth.token поле.

Когда неавторизованный пользователь выполняет запрос, request.auth переменная является null .

Используя эти данные, существует несколько распространенных способов использования аутентификации для защиты файлов:

  • Public: игнорировать request.auth
  • Заверенные частные: проверьте , что request.auth не null
  • Пользователь частное: проверьте , что request.auth.uid равняется пути uid
  • Частная группа: проверьте утверждения настраиваемого токена на соответствие выбранному утверждению или прочтите метаданные файла, чтобы узнать, существует ли поле метаданных

Общественные

Любое правило , которое не учитывает request.auth контекста можно рассматривать как public правило, поскольку он не учитывает контекст аутентификации пользователя. Эти правила могут быть полезны для вывода общедоступных данных, таких как игровые ресурсы, звуковые файлы или другой статический контент.

// Anyone to read a public image if the file is less than 100kB
// Anyone can upload a public file ending in '.txt'
match /public/{imageId} {
  allow read: if resource.size < 100 * 1024;
  allow write: if imageId.matches(".*\\.txt");
}

Аутентифицированный частный

В некоторых случаях может потребоваться, чтобы данные были доступны для просмотра всем пользователям вашего приложения, прошедшим проверку подлинности, но не пользователям, не прошедшим проверку подлинности. Поскольку request.auth переменной null для всех непроверенных пользователей, все , что вам нужно сделать , это проверить request.auth переменных существует для того , чтобы требовать аутентификаций:

// Require authentication on all internal image reads
match /internal/{imageId} {
  allow read: if request.auth != null;
}

Личный пользователь

К наиболее распространенному примеру использования request.auth будет предоставлять отдельные пользователь с зернистыми разрешениями на свои файлы: от загрузки рисунков профиля читать личные документы.

Так как файлы в Cloud Storage есть полный «путь» к файлу, все , что требуется , чтобы сделать файл , управляемый пользователем является частью уникальной идентификации пользователя информации в префиксе имени файла (например, пользователя uid ) , которые могут быть проверены при оценке правила:

// Only a user can upload their profile picture, but anyone can view it
match /users/{userId}/profilePicture.png {
  allow read;
  allow write: if request.auth.uid == userId;
}

Группа закрытая

Другим не менее распространенным вариантом использования будет разрешение групповых разрешений на объект, например разрешение нескольким членам команды совместно работать над общим документом. Для этого есть несколько подходов:

  • Чеканить Firebase аутентификации пользовательского маркера , который содержит дополнительную информацию о члене группы (например, идентификатор группы)
  • Включить информацию о группе (например, идентификатор группы или список авторизованных uid с) в метаданных файла

Как только эти данные будут сохранены в метаданных токена или файла, на них можно будет ссылаться из правила:

// Allow reads if the group ID in your token matches the file metadata's `owner` property
// Allow writes if the group ID is in the user's custom token
match /files/{groupId}/{fileName} {
  allow read: if resource.metadata.owner == request.auth.token.groupId;
  allow write: if request.auth.token.groupId == groupId;
}

Запросить оценку

Загрузки, загрузки, метаданные изменений и удаления оцениваются с помощью request отправляется в Cloud Storage. В дополнении к уникальному идентификатору пользователя и полезной нагрузке Firebase аутентификации в request.auth объекте , как описано выше, request переменный содержит путь к файлу , где запрос выполняет, то время , когда принимается запрос, и новый resource значение , если запрос - запись. Заголовки HTTP и состояние аутентификации также включены.

request объект также содержит уникальный идентификатор пользователя и полезную нагрузку Firebase аутентификации в request.auth объекте, который будет рассмотрен далее в пользователе безопасности на основе разделе Документов.

Полный список свойств в request объекте доступен ниже:

Имущество Тип Описание
auth карта <строка, строка> Когда пользователь вошел в систему , обеспечивает uid , уникальный идентификатор пользователя, и token , карта претензий Firebase аутентификации JWT. В противном случае, это будет null .
params карта <строка, строка> Карта, содержащая параметры запроса запроса.
path дорожка path , представляющий путь запрос, выполняемый в.
resource карта <строка, строка> Новое значение ресурса, присутствует только на write запросов.
time отметка времени Метка времени, представляющая время сервера, в которое оценивается запрос.

Оценка ресурсов

При оценке правил вы также можете оценить метаданные загружаемого, загружаемого, изменяемого или удаляемого файла. Это позволяет вам создавать сложные и мощные правила, которые позволяют загружать только файлы с определенным типом содержимого или удалять только файлы, размер которых превышает определенный.

Firebase Правила безопасности для Cloud Storage предоставляет метаданные файла в resource объекта, который содержит пары ключ / значение метаданных всплыли в объекте Cloud Storage. Эти свойства могут быть проверены на read или write запросов , для обеспечения целостности данных.

На write запросы (например, добавление, метаданные обновлений и удалений), в дополнении к resource объекту, который содержит метаданные для файла , который в настоящее время существует в пути запроса, у вас также есть возможность использовать request.resource объект, который содержит подмножество метаданных файла, которые должны быть записаны, если запись разрешена. Вы можете использовать эти два значения для обеспечения целостности данных или для применения ограничений приложения, таких как тип или размер файла.

Полный список свойств в resource объекта доступен ниже:

Имущество Тип Описание
name нить Полное название объекта
bucket нить Имя сегмента, в котором находится этот объект.
generation int Поколение объект Google Cloud Storage этого объекта.
metageneration int Объект metageneration Google Cloud Storage этого объекта.
size int Размер объекта в байтах.
timeCreated отметка времени Отметка времени, представляющая время создания объекта.
updated отметка времени Отметка времени, представляющая время последнего обновления объекта.
md5Hash нить Хеш MD5 объекта.
crc32c нить Хеш crc32c объекта.
etag нить Тег, связанный с этим объектом.
contentDisposition нить Расположение содержимого, связанное с этим объектом.
contentEncoding нить Кодировка содержимого, связанная с этим объектом.
contentLanguage нить Язык содержимого, связанный с этим объектом.
contentType нить Тип контента, связанный с этим объектом.
metadata карта <строка, строка> Пары ключ / значение дополнительных пользовательских метаданных, указанных разработчиком.

request.resource содержит все из них, за исключением generation , metageneration , etag , timeCreated и updated .

Подтвердить данные

Firebase Правила безопасности для Cloud Storage можно также использовать для проверки данных, в том числе проверки имя файла и путь к нему , а также свойства метаданных файла , такие как contentType и size .

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{imageId} {
      // Only allow uploads of any image file that's less than 5MB
      allow write: if request.resource.size < 5 * 1024 * 1024
                   && request.resource.contentType.matches('image/.*');
    }
  }
}

Пользовательские функции

По мере того, как ваши правила безопасности Firebase становятся более сложными, вы можете заключить наборы условий в функции, которые вы можете повторно использовать в своем наборе правил. Правила безопасности поддерживают настраиваемые функции. Синтаксис пользовательских функций немного похож на JavaScript, но функции правил безопасности Firebase написаны на предметно-ориентированном языке, который имеет некоторые важные ограничения:

  • Функции могут содержать только один return заявление. Они не могут содержать никакой дополнительной логики. Например, они не могут выполнять циклы или вызывать внешние службы.
  • Функции могут автоматически обращаться к функциям и переменным из области, в которой они определены. Например, функция , определенная в рамках service firebase.storage сферы имеет доступ к resource переменной, так и для облачных Firestore только встроенные функции , такие как get() и exists() .
  • Функции могут вызывать другие функции, но не могут выполнять рекурсию. Общая глубина стека вызовов ограничена 10.
  • В версии rules2 , функции могут определять переменные , используя let ключевое слово. Функции могут иметь любое количество привязок let, но должны заканчиваться оператором return.

Функция определяется с function ключевым словом и принимает ноль или более аргументов. Например, вы можете объединить два типа условий, использованных в приведенных выше примерах, в одну функцию:

service firebase.storage {
  match /b/{bucket}/o {
    // True if the user is signed in or the requested data is 'public'
    function signedInOrPublic() {
      return request.auth.uid != null || resource.data.visibility == 'public';
    }
    match /images/{imageId} {
      allow read, write: if signedInOrPublic();
    }
    match /mp3s/{mp3Ids} {
      allow read: if signedInOrPublic();
    }
  }
}

Использование функций в ваших правилах безопасности Firebase делает их более удобными в обслуживании по мере роста сложности ваших правил.

Следующие шаги

После обсуждения условий вы лучше понимаете Правила и готовы:

Узнайте, как обрабатывать основные варианты использования, и изучите рабочий процесс для разработки, тестирования и развертывания правил: