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