Google is committed to advancing racial equity for Black communities. See how.
Эта страница была переведа с помощью Cloud Translation API.
Switch to English

Научитесь защищать файлы

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

Понять правила

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

// If no condition is specified, the rule evaluates to true
allow read;

// Rules can optionally specify a condition
allow write: if <condition>;

// Rules can also specify multiple request methods
allow read, write: if <condition>;

Соответствующие пути

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

Точные совпадения

// Exact match for "images/profilePhoto.png"
match /images/profilePhoto.png {
  allow write: if <condition>;
}

// Exact match for "images/croppedProfilePhoto.png"
match /images/croppedProfilePhoto.png {
  allow write: if <other_condition>;
}

Вложенные матчи

// Partial match for files that start with "images"
match /images {
  // Exact match for "images/profilePhoto.png"
  match /profilePhoto.png {
    allow write: if <condition>;
  }

  // Exact match for "images/croppedProfilePhoto.png"
  match /croppedProfilePhoto.png {
    allow write: if <other_condition>;
  }
}

Подстановочные совпадения

Правила также можно использовать для match с шаблоном с использованием подстановочных знаков. Подстановочный знак - это именованная переменная, которая представляет собой одну строку, такую ​​как profilePhoto.png , или несколько сегментов пути, таких как images/profilePhoto.png .

Подстановочный знак создается путем добавления фигурных скобок вокруг имени подстановочного знака, например {string} . Многосегментный подстановочный знак можно объявить, добавив =** к имени подстановочного знака, например, {path=**} :

// Partial match for files that start with "images"
match /images {
  // Exact match for "images/*"
  // e.g. images/profilePhoto.png is matched
  match /{imageId} {
    // This rule only matches a single path segment (*)
    // imageId is a string that contains the specific segment matched
    allow read: if <condition>;
  }

  // Exact match for "images/**"
  // e.g. images/users/user:12345/profilePhoto.png is matched
  // images/profilePhoto.png is also matched!
  match /{allImages=**} {
    // This rule matches one or more path segments (**)
    // allImages is a path that contains all segments matched
    allow read: if <other_condition>;
  }
}

Если несколько правил соответствуют файлу, результатом является OR результата всех оценок правил. То есть, если какое-либо правило файла соответствует evalutes true , результат равен true .

В приведенных выше правилах файл «images / profilePhoto.png» может быть прочитан, если condition или other_condition значение true, а файл «images / users / user: 12345 / profilePhoto.png» зависит только от результата other_condition ,

На переменную подстановочного знака можно ссылаться из match предоставляя имя файла или путь авторизации:

// Another way to restrict the name of a file
match /images/{imageId} {
  allow read: if imageId == "profilePhoto.png";
}

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

Запрос оценки

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

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

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

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

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

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

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

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

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

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

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

Полный пример

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

service firebase.storage {
 match /b/{bucket}/o {
   match /images {
     // Cascade read to any image type at any path
     match /{allImages=**} {
       allow read;
     }

     // Allow write files to the path "images/*", subject to the constraints:
     // 1) File is less than 5MB
     // 2) Content type is an image
     // 3) Uploaded content type matches existing content type (if it exists)
     // 4) File name (stored in imageId wildcard variable) is less than 32 characters
     match /{imageId} {
       allow write: if request.resource.size < 5 * 1024 * 1024
                    && request.resource.contentType.matches('image/.*')
                    && (resource == null || request.resource.contentType == resource.contentType)
                    && imageId.size() < 32
     }
   }
 }
}

Теперь давайте интегрируем проверку подлинности Firebase для детального доступа к файлам в разделе « Безопасность пользователя ».