Regras de segurança para operações de pipeline
As regras de operações de pipeline permitem que você corresponda aos recursos de filtragem do mecanismo de regras atual. Embora as operações de pipeline ofereçam um conjunto avançado de recursos, o mecanismo de regras é restrito ao reconhecimento de filtros simples para garantir a satisfação e a segurança da consulta.
Requisitos de edição e modo
Este documento se aplica à edição Enterprise do Firestore no modo nativo.
Expressões de filtro compatíveis
Para que uma consulta seja restrita pelas suas regras, ela precisa usar operadores de comparação padrão com constantes. O mecanismo de regras reconhece os seguintes tipos de filtros:
- Igualdade e desigualdade:
eq,neq. - Comparações:
gt,gte,lt,lte. - Assinatura:
in,arrayContains.
Veja alguns exemplos:
where(eq("foo", 2))where(lt("foo", 2))documents("/user/1", "/user/2").where(...)
Propriedades da solicitação
Você pode continuar usando o objeto request para validar a autenticação e o contexto da consulta, embora algumas propriedades disponíveis em consultas padrão não sejam compatíveis com pipelines.
Propriedades compatíveis
O novo mecanismo continua oferecendo suporte às seguintes propriedades:
request.auth: acesse o UID do usuário e os dados do token.request.method: identifica a operação (por exemplo,get,list).request.path: o caminho do recurso que está sendo acessado.request.time: o carimbo de data/hora do lado do servidor da solicitação.
Propriedades não compatíveis
As propriedades request.query, como limit, offset e orderBy, não são compatíveis com as verificações de regras de pipelines devido à complexidade de determinar esses valores em consultas de várias etapas.
Processamento e permissões de estágio do pipeline
Há diferentes estágios de pipeline que são mapeados para operações granulares específicas em regras de segurança:
- Permissões
allow list: acionadas pelas etapascollection(),collectionGroup()edatabase(). - Permissões de
allow get: acionadas pela etapadocuments(), que é tratada de maneira semelhante a uma operação em loteget. - Permissões
allow create: acionadas pelas etapasinsert()eupsert()ao criar novos documentos. - Permissões
allow update: acionadas pelas etapasupdate()eupsert()ao atualizar documentos. - Permissões
allow delete: acionadas pelas etapasdelete(). - Permissões
allow write: aplicam-se a todas as operações de DML (insert(),update(),upsert()edelete()). - Etapas de modificação de campo: as regras só operam em dados armazenados, não em valores derivados. Se um pipeline incluir estágios que modificam campos (por exemplo,
AddFields,ReplaceWith,Select), o mecanismo de regras vai parar de aplicar restrições de filtro depois que esse estágio for encontrado. - Etapa de literais: a etapa
literals()não lê do banco de dados, mas pode gerar custos. Para evitar abusos, ele precisa ser combinado com outro estágio (comocollection()) que pode ser verificado por regras.
Estágios da linguagem de manipulação de dados (DML) e regras de segurança
Ao executar as etapas da linguagem de manipulação de dados (DML, na sigla em inglês) (insert(), update(), upsert() e delete()), as regras de segurança avaliam as permissões de maneira diferente
das consultas de leitura:
- Avaliação de regras por documento: ao contrário dos pipelines de leitura, que exigem expressões de filtro antecipadamente para restringir a consulta no momento do planejamento, as operações de DML avaliam as regras de segurança em relação a cada mutação de documento individual.
- Variáveis de regra:
request.resource: contém os dados do documento proposto para as operaçõesinsert(),update()eupsert().resource: contém os dados do documento atual armazenados no banco de dados antes da modificação (disponível paraupdate(),delete()eupsert()de documentos atuais).
Limites do sistema e comportamento de execução com DML
Ao executar operações de DML com regras de segurança, tenha em mente os seguintes limites do sistema e comportamentos de execução:
O limite de 20 pesquisas em get() e exists()
As regras de segurança do Firebase permitem no máximo 20 pesquisas de documentos (get() ou
exists()) em uma solicitação inteira.
Quando um pipeline de DML é executado fora de uma transação explícita, os documentos são processados em lotes. Como cada lote é executado na própria transação e os documentos podem ser modificados simultaneamente entre os lotes, as regras de segurança e as pesquisas de documentos são reavaliadas para cada lote de gravação.
Mesmo que as regras de segurança sejam avaliadas em relação a um único documento estático, por exemplo, verificando se um usuário é administrador:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /posts/{postId} {
allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.isAdmin == true;
}
}
}
Cada lote de gravação de documentos realiza uma pesquisa. Como resultado, depois de gravar
todos os documentos possíveis, o limite de 20 pesquisas para a solicitação é atingido,
e o pipeline falha com um erro PERMISSION_DENIED. Além disso, cada
pesquisa realizada por lote de gravação gera o próprio faturamento de leitura.
Sucesso parcial e PERMISSION_DENIED
Quando executadas fora de uma transação, as operações de DML confirmam as gravações em
lotes sequenciais. Se um lote falhar, seja porque um documento não atende a uma condição de regra
ou porque o limite de 20 pesquisas foi excedido, o pipeline será interrompido e
retornará um erro PERMISSION_DENIED.
No entanto, os lotes que já foram confirmados não são revertidos. O banco de dados permanece em um estado parcialmente atualizado. Como o cliente recebe um erro sem uma lista de documentos modificados, é necessário consultar seus dados para inspecionar quais gravações foram bem-sucedidas.
Como diagnosticar falhas de regras com os Registros de Auditoria do Cloud
Por motivos de segurança, os erros PERMISSION_DENIED voltados para o cliente não divulgam
qual condição da regra de segurança falhou ou se o limite de 20 pesquisas foi atingido.
Para diagnosticar falhas na avaliação de regras, os administradores do projeto podem inspecionar
os registros de auditoria do Cloud no console do Google Cloud (em Firestore >
Monitoramento ou na Análise de registros) para conferir entradas detalhadas do
EvaluationError.