Quando agente cria um banco de dados no firestore e configuramos ele para ficar em "Production mode", isso faz com que o firestore crie regras que impedem que qualquer pessoa leia ou escreva no banco de dados. Mas quando configuramos o banco de dados para ficar no "Test mode", acontece que qualquer pessoa que tenha a referência do banco de dados pode interagir com ele.
Então, quando estamos desenvolvendo uma aplicação, faz sentido configurar inicialmente nosso banco de dados em "Test mode" para no bloquear o acesso a ele sendo que todo hora agente vai estar modificando os dados nele. Mas temos que saber que quando configuramos o banco em "Test mode", automaticamente o firestore deixa as regras de segurança desabilitadas por 30 dias, ou seja, em "Test mode" as regras de segurança que permitem que qualquer pessoa possa ler e escrever no banco, ficam válidas só por 30 dias, e passado esse tempo nem agente nem nenhuma pessoa poderá ler o escrever no banco de dados.
NOTA: Durante esses 30 dias o firestore fica nos enviando e-mails nos avisando que o acesso ao banco de dados não será possível passados os 30 dias, portanto, eventualmente agente deve configurar as regras de segurança que para proteger nossa aplicação.
Então, para modificar as regras de segurança de nosso banco de dados, abrimos nosso bando no firestore e selecionamos a aba "Rules". Uma vez dentro veremos umas regras escritas em uma linguagem parecida a JavaScript (mas na verdade é uma linguagem própria do firestore). A seguir se mostram as regas:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.time < timestamp.date(2024, 3, 18);
}
}
}
//a primeira linha só indica que está se usando a versão número 2 (esta versão implementou melhoras com respeito á anterior)
//a segunda linha indica que essas regras são do serviço de firestore (isso evita possíveis conflitos com outros serviços de firebase)
//na terceira linha (que está dentro do escopo (das chaves) do cloud.firestore) podemos ver um "match" (um match é como se fosse uma regex). Temos que saber que as regras de segurança do firestore são baseadas em match, que são instruções que identificam um documento no banco de dados. Então, essa terceira linha está dizendo que as regras que foram declaradas dentro de seu escopo (as regras que estão dentro de suas chaves), vão dar match com qualquer banco de dados do firestore dentro do projeto (atualmente só é permitido um único banco de dados por projeto mais isso poderia mudar no futuro).
//Então, podemos dizer que as regras de segurança do firestore sempre terão a seguinte estrutura:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
//em esta parte é que irão as regras de segurança que iremos implementar
}
}
//a quarta linha ( match /{document=**} ) o que está dizendo é que para todo document dentro de qualquer collection devem ser executadas as regras de segurança que estão dentro do escopo (das chaves) deste match.
// e por último, a quinta linha está dizendo que é permitido a leitura e escritura de nosso banco de dados no entanto a data seja menor que o 13/03/2024
//se quisermos tirar essa restrição da data poderíamos modificar essa quinta linha deixando-a assim:
allow read, write: if true;
//ou também poderiamos ter deixado ela assim:
allow read, write;
//Nota: para não permitir nem leitura nem escritura, a linha anterior poderia ter ficado assim:
allow read, write: if false;
Então, uma vez que modificamos as regras de segurança, antes de aplicar (publicar) as modificações feitas podemos testá-las para comprovar que funcionam como esperado. Para fazer isso, na parte de abaixo das regras podemos fazer clique no enlace "Laboratorio de teste de regras" (Rules Playground). O "Laboratorio de teste de regras" é um lugar onde podemos simular requisições a nosso banco de dados. Aí dentro já vem selecionado por padrão o verbo http "GET" e em location podemos indicar o caminho para um resource, ou seja, para um document.
Por exemplo, no campo resource podemos colocar o id de um document da seguinte forma:
/games/Ry15CUVn6EBL1iebVhHv
onde "games" é o nome do collection e "Ry15CUVn6EBL1iebVhHv" é o id de um document que está dentro do collection games. Então, al clicar em executar, obteremos uma resposta dizendo que a "leitura" foi permitida (caso a regra atual esteja permitindo)
Notas sobre regras:
Quando não existe uma regra para os documents de um collection, por padrão a leitura desses documents é bloqueada. Este principio também vale para a escritura de documents
Se há uma regra que permite a leitura de todos os documents do banco de dados, não adianta colocar uma regra especifica para bloquear a leitura de um docuemnt em uma collection especifica do banco de dados, já que a regra que permite a leitura de todos os documents de qualquer collection, vai sobrescrever a regra anterior.
Se tenho várias collection que por sua vez contem vários documents cada um, devo especificar uma regra para os documents de cada collection, ou seja, devo especificar uma regra para os documents do primeiro collection, depois especificar outra regra para os documents do segundo collection e assim por diante
Segue exemplo onde temos dos regras (estamos supondo que temos dois collections no banco de dados):
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /games/{document} { //regra #1
allow read, write: if true;
}
match /users/{document} { //regra #1
allow read, write: if false;
}
}
}
//a regra #1 indica que a leitura e escritura de todos os documents do collection "games" está permitida
//a regra #2 indica que a leitura e escritura de todos os documents do collection "users" está permitida
NOTA IMPORTANTE: Só vamos permitir a leitura e escritura no nosso banco de dados no entanto agente estiver desenvolvendo nossa aplicação, ou seja, nunca devemos publicar uma aplicação e deixar a leitura e escrita liberada no banco de dados já que qualquer pessoa poderia modificar e até apagar nosso banco de dados.
Introdução a regras de segurança no Firestore
Quando agente cria um banco de dados no firestore e configuramos ele para ficar em "Production mode", isso faz com que o firestore crie regras que impedem que qualquer pessoa leia ou escreva no banco de dados. Mas quando configuramos o banco de dados para ficar no "Test mode", acontece que qualquer pessoa que tenha a referência do banco de dados pode interagir com ele.
Então, quando estamos desenvolvendo uma aplicação, faz sentido configurar inicialmente nosso banco de dados em "Test mode" para no bloquear o acesso a ele sendo que todo hora agente vai estar modificando os dados nele. Mas temos que saber que quando configuramos o banco em "Test mode", automaticamente o firestore deixa as regras de segurança desabilitadas por 30 dias, ou seja, em "Test mode" as regras de segurança que permitem que qualquer pessoa possa ler e escrever no banco, ficam válidas só por 30 dias, e passado esse tempo nem agente nem nenhuma pessoa poderá ler o escrever no banco de dados.
NOTA: Durante esses 30 dias o firestore fica nos enviando e-mails nos avisando que o acesso ao banco de dados não será possível passados os 30 dias, portanto, eventualmente agente deve configurar as regras de segurança que para proteger nossa aplicação.
Então, para modificar as regras de segurança de nosso banco de dados, abrimos nosso bando no firestore e selecionamos a aba "Rules". Uma vez dentro veremos umas regras escritas em uma linguagem parecida a JavaScript (mas na verdade é uma linguagem própria do firestore). A seguir se mostram as regas:
Então, uma vez que modificamos as regras de segurança, antes de aplicar (publicar) as modificações feitas podemos testá-las para comprovar que funcionam como esperado. Para fazer isso, na parte de abaixo das regras podemos fazer clique no enlace "Laboratorio de teste de regras" (Rules Playground). O "Laboratorio de teste de regras" é um lugar onde podemos simular requisições a nosso banco de dados. Aí dentro já vem selecionado por padrão o verbo http "GET" e em location podemos indicar o caminho para um resource, ou seja, para um document.
Por exemplo, no campo resource podemos colocar o id de um document da seguinte forma:
/games/Ry15CUVn6EBL1iebVhHv
onde "games" é o nome do collection e "Ry15CUVn6EBL1iebVhHv" é o id de um document que está dentro do collection games. Então, al clicar em executar, obteremos uma resposta dizendo que a "leitura" foi permitida (caso a regra atual esteja permitindo)
Notas sobre regras:
Segue exemplo onde temos dos regras (estamos supondo que temos dois collections no banco de dados):
NOTA IMPORTANTE: Só vamos permitir a leitura e escritura no nosso banco de dados no entanto agente estiver desenvolvendo nossa aplicação, ou seja, nunca devemos publicar uma aplicação e deixar a leitura e escrita liberada no banco de dados já que qualquer pessoa poderia modificar e até apagar nosso banco de dados.
No seguinte link poderemos ver mais informação sobre as regras de segurança no firestore: https://firebase.google.com/docs/firestore/security/overview