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 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;
}
}
Вы можете получить доступ к пользовательским утверждениям в Rules после создания пользовательских утверждений в Authentication . Затем вы можете ссылаться на эти пользовательские утверждения с помощью переменной 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 , см. раздел Базовые правила безопасности .
,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 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;
}
}
Вы можете получить доступ к пользовательским утверждениям в Rules после создания пользовательских утверждений в Authentication . Затем вы можете ссылаться на эти пользовательские утверждения с помощью переменной 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 , см. раздел Базовые правила безопасности .