Regras de segurança para operações de pipeline

O principal objetivo do suporte a regras de consultas de pipeline é corresponder aos recursos de filtragem do mecanismo de regras atual. Embora as consultas 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.

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 etapas collection(), collectionGroup() e database().
  • Permissões de allow get: acionadas pela etapa documents(), que é tratada de maneira semelhante a uma operação em lote get.
  • 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 (como collection()) que pode ser verificado por regras.