Firebase Security Rules для Cloud Storage позволяют вам контролировать доступ к объектам, хранящимся в сегментах Cloud Storage . Гибкий синтаксис правил позволяет создавать правила для управления любой операцией — от всех операций записи в корзину Cloud Storage до операций с конкретным файлом.
В этом руководстве описываются базовый синтаксис и структура Cloud Storage Security Rules для создания полных наборов правил.
Декларация службы и базы данных
Firebase Security Rules для Cloud Storage всегда начинаются со следующего объявления:
service firebase.storage {
// ...
}
Объявление service firebase.storage
распространяет правила на Cloud Storage , предотвращая конфликты между Cloud Storage Security Rules и правилами для других продуктов, таких как Cloud Firestore .
Основные правила чтения/записи
Основные правила состоят из оператора match
, определяющего сегменты Cloud Storage , оператора сопоставления, определяющего имя файла, и выражения allow
, указывающего, когда разрешено чтение указанных данных. Выражения allow
определяют используемые методы доступа (например, чтение, запись), а также условия , при которых доступ либо разрешается, либо запрещается.
В вашем наборе правил по умолчанию первый оператор match
использует подстановочное выражение {bucket}
, чтобы указать, что правила применяются ко всем сегментам в вашем проекте. Мы подробнее обсудим идею совпадений с подстановочными знаками в следующем разделе.
service firebase.storage {
// The {bucket} wildcard indicates we match files in all Cloud Storage buckets
match /b/{bucket}/o {
// Match filename
match /filename {
allow read: if <condition>;
allow write: if <condition>;
}
}
}
Все операторы сопоставления указывают на файлы. Оператор match может указывать на конкретный файл, как в match /images/profilePhoto.png
.
Подстановочные знаки соответствия
Помимо указания на один файл, Rules могут использовать подстановочные знаки для указания на любой файл с заданным строковым префиксом в имени, включая косую черту, как в match /images/{imageId}
.
В приведенном выше примере оператор сопоставления использует синтаксис подстановочного знака {imageId}
. Это означает, что правило применяется к любому файлу с /images/
в начале имени, например /images/profilePhoto.png
или /images/croppedProfilePhoto.png
. При оценке allow
выражений в операторе сопоставления переменная imageId
преобразуется в имя файла изображения, например profilePhoto.png
или croppedProfilePhoto.png
.
Из match
можно ссылаться на подстановочную переменную, чтобы указать имя файла или авторизацию пути:
// Another way to restrict the name of a file
match /images/{imageId} {
allow read: if imageId == "profilePhoto.png";
}
Иерархические данные
Как мы уже говорили, внутри сегмента Cloud Storage нет иерархической структуры. Но, используя соглашение об именовании файлов, часто включающее косую черту в именах файлов, мы можем имитировать структуру, которая выглядит как вложенная серия каталогов и подкаталогов. Важно понимать, как Firebase Security Rules взаимодействуют с этими именами файлов.
Рассмотрим ситуацию с набором файлов, имена которых начинаются с основы /images/
. Firebase Security Rules применяются только к соответствующему имени файла, поэтому элементы управления доступом, определенные в основе /images/
, не применяются к основе /mp3s/
. Вместо этого напишите явные правила, соответствующие различным шаблонам имен файлов:
service firebase.storage {
match /b/{bucket}/o {
match /images/{imageId} {
allow read, write: if <condition>;
}
// Explicitly define rules for the 'mp3s' pattern
match /mp3s/{mp3Id} {
allow read, write: if <condition>;
}
}
}
При вложении операторов match
путь внутреннего match
сопоставления всегда добавляется к пути внешнего match
сопоставления. Таким образом, следующие два набора правил эквивалентны:
service firebase.storage {
match /b/{bucket}/o {
match /images {
// Exact match for "images/profilePhoto.png"
match /profilePhoto.png {
allow write: if <condition>;
}
}
}
}
service firebase.storage {
match /b/{bucket}/o {
// Exact match for "images/profilePhoto.png"
match /images/profilePhoto.png {
allow write: if <condition>;
}
}
}
Рекурсивные подстановочные знаки совпадений
В дополнение к подстановочным знакам, которые соответствуют строкам в конце имени файла и возвращают их, можно объявить многосегментный подстановочный знак для более сложного сопоставления, добавив =**
к имени подстановочного знака, например {path=**}
:
// Partial match for files that start with "images"
match /images {
// 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
результата оценок всех правил. То есть, если какое-либо правило, которому соответствует файл, оценивается как true
, результат будет true
.
В приведенных выше правилах файл «images/profilePhoto.png» можно прочитать, если какое-либо condition
или other_condition
имеет значение true, тогда как файл «images/users/user:12345/profilePhoto.png» зависит только от результата other_condition
.
Cloud Storage Security Rules не каскадируются, и правила оцениваются только в том случае, если путь запроса совпадает с путем с указанными правилами.
Версия 1
Firebase Security Rules по умолчанию используют версию 1. В версии 1 рекурсивные подстановочные знаки соответствуют одному или нескольким элементам имени файла, а не нулю или более элементам. Таким образом, match /images/{filenamePrefixWildcard}/{imageFilename=**}
соответствует имени файла, например /images/profilePics/profile.png, но не /images/badge.png. Вместо этого используйте /images/{imagePrefixorFilename=**}
.
Рекурсивные подстановочные знаки должны располагаться в конце оператора сопоставления.
Мы рекомендуем вам использовать версию 2 из-за ее более мощных функций.
Версия 2
В Firebase Security Rules версии 2 рекурсивные подстановочные знаки соответствуют нулю или более элементам пути. Таким образом, /images/{filenamePrefixWildcard}/{imageFilename=**}
соответствует именам файлов /images/profilePics/profile.png и /images/badge.png.
Вы должны подписаться на версию 2, добавив rules_version = '2';
в верхней части правил безопасности:
rules_version = '2';
service cloud.storage {
match /b/{bucket}/o {
...
}
}
Вы можете использовать не более одного рекурсивного подстановочного знака для каждого оператора сопоставления, но в версии 2 вы можете разместить этот подстановочный знак в любом месте оператора сопоставления. Например:
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
// Matches any file in a songs "subdirectory" under the
// top level of your Cloud Storage bucket.
match /{prefixSegment=**}/songs/{mp3filenames} {
allow read, write: if <condition>;
}
}
}
Детальные операции
В некоторых ситуациях полезно разбить read
и write
на более детальные операции. Например, вашему приложению может потребоваться применять разные условия при создании файла, чем при его удалении.
Операцию read
можно разбить на get
и list
.
Правило write
можно разбить на create
, update
и delete
:
service firebase.storage { match /b/{bucket}/o { // A read rule can be divided into read and list rules match /images/{imageId} { // Applies to single file read requests allow get: if <condition>; // Applies to list and listAll requests (Rules Version 2) allow list: if <condition>; // A write rule can be divided into create, update, and delete rules match /images/{imageId} { // Applies to writes to file contents allow create: if <condition>; // Applies to updates to (pre-existing) file metadata allow update: if <condition>; // Applies to delete operations allow delete: if <condition>; } } } }
Перекрывающиеся операторы сопоставления
Имя файла может соответствовать более чем одному оператору match
. В случае, когда запросу соответствует несколько выражений allow
, доступ разрешается, если какое-либо из условий true
:
service firebase.storage {
match b/{bucket}/o {
// Matches file names directly inside of '/images/'.
match /images/{imageId} {
allow read, write: if false;
}
// Matches file names anywhere under `/images/`
match /images/{imageId=**} {
allow read, write: if true;
}
}
}
В приведенном выше примере все операции чтения и записи в файлы, имена которых начинаются с /images/
разрешены, поскольку второе правило всегда true
, даже если первое правило false
.
Правила — это не фильтры
Как только вы защитите свои данные и начнете выполнять операции с файлами, имейте в виду, что правила безопасности не являются фильтрами. Вы не можете выполнять операции с набором файлов, соответствующих шаблону имен файлов, и ожидать, что Cloud Storage будет иметь доступ только к тем файлам, на доступ к которым у текущего клиента есть разрешение.
Например, возьмем следующее правило безопасности:
service firebase.storage {
match /b/{bucket}/o {
// Allow the client to read files with contentType 'image/png'
match /aFileNamePrefix/{aFileName} {
allow read: if resource.contentType == 'image/png';
}
}
}
Отказано : это правило отклоняет следующий запрос, поскольку набор результатов может включать файлы, в которых contentType
не равен image/png
:
Интернет
filesRef = storage.ref().child("aFilenamePrefix"); filesRef.listAll() .then(function(result) { console.log("Success: ", result.items); }) });
Правила в Cloud Storage Security Rules оценивают каждый запрос на предмет его потенциального результата и отклоняют запрос, если он может вернуть файл, на чтение которого у клиента нет разрешения. Запросы на доступ должны соответствовать ограничениям, установленным вашими правилами.
Следующие шаги
Вы можете углубить свое понимание Firebase Security Rules для Cloud Storage :
Изучите следующую важную концепцию языка правил — динамические условия , которые позволяют вашим правилам проверять авторизацию пользователя, сравнивать существующие и входящие данные, проверять входящие данные и многое другое.
Ознакомьтесь с типичными вариантами использования безопасности и определениями Firebase Security Rules , которые их касаются .
Вы можете изучить варианты использования Firebase Security Rules , специфичные для Cloud Storage :