获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

Entenda as regras de segurança do Firebase Realtime Database

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