As Firebase Security Rules oferecem controle de acesso e validação de dados em um formato compatível com vários níveis de complexidade. Para criar sistemas de acesso baseados em usuários e em papéis que protegem os dados dos usuários, use o Firebase Authentication com o Firebase Security Rules.
Identificar usuários
Authentication identifica os usuários que solicitam acesso aos seus dados e fornece essas
informações como uma variável que pode ser utilizada nas suas regras. A variável auth
contém as seguintes informações:
uid
: um ID de usuário exclusivo, atribuído ao usuário solicitante.token
:um mapa de valores coletados por Authentication.
A variável auth.token
contém os seguintes valores:
Campo | Descrição |
---|---|
email |
O endereço de e-mail associado à conta, se essa informação existir. |
email_verified |
true se o usuário tiver verificado que tem acesso ao endereço email . Alguns provedores verificam automaticamente esses endereços de e-mail. |
phone_number |
O número de telefone associado à conta, se essa informação existir. |
name |
O nome de exibição do usuário, se ele tiver sido definido. |
sub |
O UID do Firebase do usuário. Ele é exclusivo dentro de um projeto. |
firebase.identities |
O dicionário de todas as identidades associadas à conta desse usuário. As chaves do dicionário podem ser qualquer uma das seguintes: email , phone , google.com , facebook.com , github.com , twitter.com . Os valores do dicionário são matrizes de identificadores exclusivos de cada provedor de identidade associado à conta. Por exemplo, auth.token.firebase.identities["google.com"][0] contém o primeiro ID de usuário do Google associado à conta. |
firebase.sign_in_provider |
O provedor de entrada usado para receber esse token. Pode ser uma das seguintes strings: custom , password , phone , anonymous , google.com , facebook.com , github.com ou twitter.com . |
firebase.tenant |
O ID do locatário associado à conta, se houver. Por exemplo, tenant2-m6tyz . |
Se você quiser adicionar atributos de autenticação personalizados, a variável auth.token
também vai conter todas as declarações personalizadas
que você especificar.
Quando o usuário que está solicitando acesso não está conectado, a variável auth
é null
.
É possível aproveitar isso nas suas regras se, por exemplo, você quiser limitar o acesso de leitura a usuários autenticados: auth != null
. No entanto, geralmente recomendamos restringir ainda mais o acesso de gravação.
Para mais informações sobre a variável auth
, consulte a documentação
de referência para
Cloud Firestore,
Realtime Database e
Cloud Storage.
Utilizar as informações do usuário nas regras
Na prática, o uso de informações autenticadas nas regras torna-as mais eficientes e flexíveis. É possível controlar o acesso aos dados com base na identidade do usuário.
Nas suas regras, defina como as informações na variável auth
, as informações do usuário do solicitante, correspondem às informações do usuário associadas aos dados solicitados.
Por exemplo, pode ser que seu aplicativo queira garantir que os usuários só tenham permissão para ler e gravar os próprios dados deles. Nesse cenário, você quer uma correspondência entre a variável auth.uid
e o código do usuário nos dados solicitados:
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;
}
}
}
{
"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"
}
}
}
}
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;
}
}
Definir informações personalizadas do usuário
É possível tirar ainda mais proveito da variável auth
para definir campos personalizados atribuídos aos usuários do aplicativo.
Por exemplo, suponha que você queira criar um papel de administrador que permita o acesso de gravação em determinados caminhos. Você designaria esse atributo aos usuários e, em seguida, utilizaria as regras que concedem acesso aos caminhos.
No Cloud Firestore, é possível adicionar um campo personalizado aos documentos dos usuários e recuperar o valor desse campo com uma leitura incorporada nas regras. Dessa forma, sua regra com base no administrador será semelhante ao exemplo a seguir:
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;
}
}
Você pode acessar declarações personalizadas em Rules depois de criar declarações personalizadas em Authentication. É possível
fazer referência a essas declarações personalizadas usando a variável auth.token
.
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";
}
}
}
{
"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"
}
}
}
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;
}
}
Para mais exemplos de Rules básico que usam Authentication, consulte Regras básicas de segurança.