Firebase Security Rules обеспечивают контроль доступа и проверку данных в формате, поддерживающем несколько уровней сложности. Для создания систем доступа на основе пользователей и ролей, обеспечивающих безопасность данных ваших пользователей, используйте Firebase Authentication с Firebase Security Rules .
Идентификация пользователей
Authentication идентифицирует пользователей, запрашивающих доступ к вашим данным, и предоставляет эту информацию в виде переменной, которую вы можете использовать в своих правилах. Переменная auth содержит следующую информацию:
-
uid: Уникальный идентификатор пользователя, присваиваемый пользователю, отправившему запрос. -
token: Карта значений, собранных в процессе Authentication .
Переменная auth.token содержит следующие значения:
| Поле | Описание |
|---|---|
email | Адрес электронной почты, связанный с учетной записью, если таковой имеется. |
email_verified | true если пользователь подтвердил наличие доступа к адресу email . Некоторые провайдеры автоматически проверяют принадлежащие им адреса электронной почты. |
phone_number | Номер телефона, связанный с учетной записью, если таковой имеется. |
name | Отображаемое имя пользователя, если оно задано. |
sub | Идентификатор пользователя в Firebase (Firebase UID). Этот идентификатор уникален в рамках одного проекта. |
firebase.identities | Словарь всех идентификаторов, связанных с учетной записью этого пользователя. Ключами словаря могут быть любые из следующих: email , phone , google.com , facebook.com , github.com , twitter.com . Значения словаря представляют собой массивы уникальных идентификаторов для каждого поставщика идентификации, связанного с учетной записью. Например, auth.token.firebase.identities["google.com"][0] содержит первый идентификатор пользователя Google, связанный с учетной записью. |
firebase.sign_in_provider | Указан поставщик услуг авторизации, использованный для получения этого токена. Может принимать одно из следующих значений: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com . |
firebase.tenant | Идентификатор арендатора (tenantId), связанный с учетной записью, если таковой имеется. Например, tenant2-m6tyz |
Если вы хотите добавить пользовательские атрибуты аутентификации, переменная auth.token также будет содержать любые указанные вами пользовательские утверждения .
Если пользователь, запрашивающий доступ, не авторизован, переменная auth имеет null . Вы можете использовать это в своих правилах, например, если хотите ограничить доступ на чтение только авторизованным пользователям — auth != null . Однако мы обычно рекомендуем дополнительно ограничить доступ на запись.
Для получения дополнительной информации о переменной auth см. справочную документацию по Cloud Firestore , Realtime Database и Cloud Storage .
Используйте информацию о пользователях в правилах.
На практике использование аутентифицированной информации в правилах делает их более мощными и гибкими. Вы можете контролировать доступ к данным на основе идентификации пользователя.
В своих правилах определите, как информация в переменной auth — данные пользователя, отправляющего запрос, — сопоставляется с информацией о пользователе, связанной с запрашиваемыми данными.
Например, ваше приложение может захотеть убедиться, что пользователи могут читать и записывать только свои собственные данные. В этом случае вам потребуется соответствие между переменной auth.uid и идентификатором пользователя в запрошенных данных:
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
// Make sure the uid of the requesting user matches name of the user
// document. The wildcard expression {userId} makes the userId variable
// available in rules.
match /users/{userId} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
}
}
Realtime Database
{
"rules": {
"users": {
"$userId": {
// grants write access to the owner of this user account
// whose uid must exactly match the key ($userId)
".write": "$userId === auth.uid"
}
}
}
}
Cloud Storage
service firebase.storage {
// Only a user can upload their file, but anyone can view it
match /users/{userId}/{fileName} {
allow read;
allow write: if request.auth != null && request.auth.uid == userId;
}
}
Определите пользовательскую информацию
Кроме того, вы можете использовать переменную auth для определения пользовательских полей, назначаемых пользователям вашего приложения.
Например, предположим, вы хотите создать роль «администратора», которая предоставляет право записи на определенные пути. Вы бы назначили этот атрибут пользователям, а затем использовали бы его в правилах, предоставляющих доступ к этим путям.
В Cloud Firestore вы можете добавить пользовательское поле в документы пользователей и получить значение этого поля с помощью встроенного чтения в ваших правилах. Таким образом, ваше правило для администратора будет выглядеть примерно так:
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents/some_collection: {
// Remember that, in Cloud Firestore, reads embedded in your rules are billed operations
write: if request.auth != null && get(/databases/(database)/documents/users/$(request.auth.uid)).data.admin == true;
read: if request.auth != null;
}
}
После создания пользовательских утверждений в разделе Authentication вы можете получить доступ к ним в Rules . Затем вы можете ссылаться на эти пользовательские утверждения, используя переменную auth.token .
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
// For attribute-based access control, check for an admin claim
allow write: if request.auth.token.admin == true;
allow read: true;
// Alterntatively, for role-based access, assign specific roles to users
match /some_collection/{document} {
allow read: if request.auth.token.reader == "true";
allow write: if request.auth.token.writer == "true";
}
}
}
Realtime Database
{
"rules": {
"some_path": {
"$sub_path": {
// Create a custom claim for the admin role
".write": "auth.uid !== null && auth.token.writer === true",
".read": "auth.uid !== null"
}
}
}
}
Cloud Storage
service firebase.storage {
// Create a custom claim for the admin role
match /files/{fileName} {
allow read: if request.auth.uid != null;
allow write: if request.auth.token.admin == true;
}
}
Чтобы увидеть больше примеров базовых Rules использующих Authentication , см. раздел «Базовые правила безопасности» .