Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Entenda as regras de segurança do Firebase Realtime Database

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

As regras de segurança do Firebase Realtime Database determinam quem tem acesso de leitura e gravação ao seu banco de dados, como seus dados estão estruturados e quais índices existem. Essas regras ficam nos servidores do Firebase e são aplicadas automaticamente o tempo todo. Cada solicitação de leitura e gravação só será concluída se suas regras permitirem. Por padrão, suas regras não permitem que ninguém acesse seu banco de dados. Isso é para proteger seu banco de dados contra abusos até que você tenha tempo de personalizar suas regras ou configurar a autenticação.

As regras de segurança do Realtime Database têm uma sintaxe semelhante ao JavaScript e vêm em quatro tipos:

Tipos de regras
.ler Descreve se e quando os dados podem ser lidos pelos usuários.
.Escreva Descreve se e quando os dados podem ser gravados.
.validar Define a aparência de um valor formatado corretamente, se ele possui atributos filho e o tipo de dados.
.indexOn Especifica um filho a ser indexado para dar suporte a ordenação e consulta.

Visão geral da segurança do Realtime Database

O Firebase Realtime Database oferece um conjunto completo de ferramentas para gerenciar a segurança do seu aplicativo. Essas ferramentas facilitam a autenticação de usuários, a aplicação de permissões de usuários e a validação de entradas.

Os aplicativos com tecnologia Firebase executam mais código do lado do cliente do que aqueles com muitas outras pilhas de tecnologia. Portanto, a maneira como abordamos a segurança pode ser um pouco diferente do que você está acostumado.

Autenticação

Uma primeira etapa comum para proteger seu aplicativo é identificar seus usuários. Esse processo é chamado de autenticação . Você pode usar o Firebase Authentication para que os usuários façam login no seu aplicativo. O Firebase Authentication inclui suporte drop-in para métodos de autenticação comuns, como Google e Facebook, bem como login por e-mail e senha, login anônimo e muito mais.

A identidade do usuário é um conceito de segurança importante. Diferentes usuários têm dados diferentes e, às vezes, têm recursos diferentes. Por exemplo, em um aplicativo de bate-papo, cada mensagem é associada ao usuário que a criou. Os usuários também podem excluir suas próprias mensagens, mas não as mensagens postadas por outros usuários.

Autorização

Identificar seu usuário é apenas parte da segurança. Depois de saber quem eles são, você precisa de uma maneira de controlar o acesso deles aos dados em seu banco de dados. As regras de segurança do Realtime Database permitem controlar o acesso de cada usuário. Por exemplo, aqui está um conjunto de regras de segurança que permite que qualquer pessoa leia o caminho /foo/ , mas ninguém escreva nele:

{
  "rules": {
    "foo": {
      ".read": true,
      ".write": false
    }
  }
}

As regras .read e .write em cascata, portanto, este conjunto de regras concede acesso de leitura a qualquer dado no caminho /foo/ , bem como a quaisquer caminhos mais profundos, como /foo/bar/baz . Observe que as regras .read e .write mais superficiais no banco de dados substituem as regras mais profundas, portanto, o acesso de leitura a /foo/bar/baz ainda seria concedido neste exemplo mesmo se uma regra no caminho /foo/bar/baz avaliada como false.

As regras de segurança do Realtime Database incluem variáveis ​​e funções integradas que permitem que você faça referência a outros caminhos, carimbos de data/hora do lado do servidor, informações de autenticação e muito mais. Veja um exemplo de regra que concede acesso de gravação para usuários autenticados em /users/<uid>/ , em que <uid> é o ID do usuário obtido por meio do Firebase Authentication.

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

Data de validade

O Firebase Realtime Database não tem esquema. Isso facilita a alteração das coisas à medida que você desenvolve, mas quando seu aplicativo estiver pronto para distribuição, é importante que os dados permaneçam consistentes. A linguagem de regras inclui uma regra .validate que permite aplicar lógica de validação usando as mesmas expressões usadas para regras .read e .write . A única diferença é que as regras de validação não são em cascata , portanto, todas as regras de validação relevantes devem ser avaliadas como true para que a gravação seja permitida.

Essas regras impõem que os dados gravados em /foo/ devem ser uma string com menos de 100 caracteres:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

As regras de validação têm acesso a todas as mesmas funções e variáveis ​​internas que as regras .read e .write . Você pode usá-los para criar regras de validação que estejam cientes de dados em outros lugares em seu banco de dados, a identidade de seu usuário, hora do servidor e muito mais.

Definindo índices de banco de dados

O Firebase Realtime Database permite ordenar e consultar dados. Para tamanhos de dados pequenos, o banco de dados oferece suporte a consultas ad hoc, portanto, os índices geralmente não são necessários durante o desenvolvimento. No entanto, antes de iniciar seu aplicativo, é importante especificar índices para todas as consultas necessárias para garantir que elas continuem funcionando à medida que seu aplicativo cresce.

Os índices são especificados usando a regra .indexOn . Aqui está um exemplo de declaração de índice que indexaria os campos de altura e comprimento para uma lista de dinossauros:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

Próximos passos