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