Правила безопасности Firebase Realtime Database определяют, кто имеет доступ на чтение и запись к вашей базе данных, как структурированы ваши данные и какие индексы существуют. Эти правила хранятся на серверах Firebase и автоматически применяются постоянно. Каждый запрос на чтение или запись будет выполнен только в том случае, если ваши правила это разрешают. По умолчанию ваши правила не разрешают доступ к вашей базе данных никому. Это сделано для защиты вашей базы данных от злоупотреблений до тех пор, пока у вас не появится время настроить правила или аутентификацию.
Правила безопасности баз данных в реальном времени имеют синтаксис, похожий на JavaScript, и бывают четырех типов:
| Типы правил | |
|---|---|
| .читать | Указывает, разрешено ли пользователям читать данные и когда это разрешено. |
| .писать | Указывает, разрешено ли и когда разрешается запись данных. |
| .validate | Определяет, как будет выглядеть правильно отформатированное значение, имеет ли оно дочерние атрибуты и тип данных. |
| .indexOn | Указывает дочерний элемент для индексации с целью поддержки упорядочивания и выполнения запросов. |
Обзор безопасности Realtime Database
Firebase Realtime Database предоставляет полный набор инструментов для управления безопасностью вашего приложения. Эти инструменты упрощают аутентификацию пользователей, контроль прав доступа пользователей и проверку входных данных.
Приложения, работающие на базе Firebase, выполняют больше клиентского кода, чем приложения, использующие множество других технологических стеков. Поэтому наш подход к безопасности может несколько отличаться от того, к чему вы привыкли.
Аутентификация
Первым и наиболее распространенным шагом в обеспечении безопасности вашего приложения является идентификация пользователей. Этот процесс называется аутентификацией . Вы можете использовать Firebase Authentication для авторизации пользователей в вашем приложении. Firebase Authentication включает в себя поддержку распространенных методов аутентификации, таких как Google и Facebook, а также авторизацию по электронной почте и паролю, анонимный вход и многое другое.
Идентификация пользователя — важная концепция безопасности. Разные пользователи обладают разными данными, и иногда у них разные возможности. Например, в чат-приложении каждое сообщение связано с пользователем, который его создал. Пользователи также могут удалять свои собственные сообщения, но не сообщения, опубликованные другими пользователями.
Авторизация
Идентификация пользователя — это лишь часть обеспечения безопасности. После того, как вы узнали, кто он, вам нужен способ контролировать его доступ к данным в вашей базе данных. Правила безопасности баз данных в реальном времени позволяют контролировать доступ для каждого пользователя. Например, вот набор правил безопасности, который позволяет любому читать путь /foo/ , но никому не позволяет записывать в него данные:
{
"rules": {
"foo": {
".read": true,
".write": false
}
}
} Правила .read и .write каскадно применяются, поэтому этот набор правил предоставляет доступ на чтение к любым данным по пути /foo/ а также к любым более глубоким путям, таким как /foo/bar/baz . Обратите внимание, что правила .read и .write расположенные ниже в базе данных, переопределяют более глубокие правила, поэтому доступ на чтение к /foo/bar/baz будет предоставлен в этом примере, даже если правило по пути /foo/bar/baz будет иметь значение false.
Правила безопасности баз данных в реальном времени включают встроенные переменные и функции, позволяющие ссылаться на другие пути, метки времени на стороне сервера, информацию об аутентификации и многое другое. Вот пример правила, предоставляющего авторизованным пользователям доступ на запись к /users/<uid>/ , где <uid> — это идентификатор пользователя, полученный с помощью Firebase Authentication .
{
"rules": {
"users": {
"$uid": {
".write": "$uid === auth.uid"
}
}
}
}Проверка данных
Firebase Realtime Database не имеет схемы. Это упрощает внесение изменений в процессе разработки, но после того, как ваше приложение будет готово к распространению, важно обеспечить согласованность данных. Язык правил включает правило ` .validate , которое позволяет применять логику проверки, используя те же выражения, что и для правил .read и .write . Единственное отличие заключается в том, что правила проверки не каскадируются , поэтому все соответствующие правила проверки должны иметь значение `true`, чтобы разрешить запись.
Эти правила гарантируют, что данные, записываемые в /foo/ должны представлять собой строку длиной менее 100 символов:
{
"rules": {
"foo": {
".validate": "newData.isString() && newData.val().length < 100"
}
}
} Правила проверки имеют доступ ко всем тем же встроенным функциям и переменным, что и правила .read и .write . Вы можете использовать их для создания правил проверки, учитывающих данные в других местах вашей базы данных, идентификационные данные пользователя, серверное время и многое другое.
Определение индексов базы данных
Firebase Realtime Database позволяет упорядочивать и запрашивать данные. Для небольших объемов данных база данных поддерживает произвольные запросы, поэтому индексы, как правило, не требуются на этапе разработки. Однако перед запуском приложения важно указать индексы для всех необходимых запросов, чтобы обеспечить их работоспособность по мере роста приложения.
Индексы задаются с помощью правила .indexOn . Вот пример объявления индекса, который будет индексировать поля высоты и длины для списка динозавров:
{
"rules": {
"dinosaurs": {
".indexOn": ["height", "length"]
}
}
}