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 são estruturados e quais índices existem. Essas regras residem 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 o acesso de ninguém ao seu banco de dados. Isso é para proteger seu banco de dados contra abuso até que você tenha tempo para personalizar suas regras ou configurar a autenticação.

As regras de segurança do banco de dados em tempo real 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 para indexar para dar suporte à ordenação e consulta.

Visão geral da segurança do banco de dados em tempo real

O Firebase Realtime Database fornece um conjunto completo de ferramentas para gerenciar a segurança do seu aplicativo. Essas ferramentas facilitam a autenticação de seus usuários, impõem permissões de usuário e validam entradas.

Os aplicativos baseados no Firebase executam mais códigos do lado do cliente do que aqueles com muitas outras pilhas de tecnologia. Portanto, a forma 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. Este 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 importante conceito de segurança. Usuários diferentes têm dados diferentes e, às vezes, 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 mensagens postadas por outros usuários.

Autorização

Identificar seu usuário é apenas parte da segurança. Depois de saber quem são, você precisa de uma maneira de controlar o acesso aos dados em seu banco de dados. As regras de segurança do banco de dados em tempo real permitem que você controle 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, esse conjunto de regras concede acesso de leitura a todos os dados no caminho /foo/ , bem como a quaisquer caminhos mais profundos, como /foo/bar/baz . Observe que as regras .read e .write mais rasas 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 falsa.

As regras de segurança do banco de dados em tempo real incluem variáveis ​​e funções integradas que permitem fazer referência a outros caminhos, carimbos de data/hora do lado do servidor, informações de autenticação e muito mais. Aqui está um exemplo de uma regra que concede acesso de gravação para usuários autenticados em /users/<uid>/ , onde <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 mudança durante o desenvolvimento, mas quando o 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 colocadas em cascata , portanto, todas as regras de validação relevantes devem ser avaliadas como true para que a gravação seja permitida.

Essa regra impõe 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 estão cientes dos dados em outro lugar em seu banco de dados, a identidade do usuário, horário 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. Antes de iniciar seu aplicativo, porém, é importante especificar índices para quaisquer consultas que você tenha para garantir que 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