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"] } } }