Menu Docs

Implementar redação em nível de campo

Nesta página

O operador de pipeline $redact restringe o conteúdo dos documentos com base nas informações armazenadas nos próprios documentos.

Diagram of security architecture with middleware and redaction.

Para armazenar os dados dos critérios de acesso, adicione um campo aos documentos e documentos incorporados. Para permitir várias combinações de níveis de acesso para os mesmos dados, considere definir o campo de acesso para uma array de arrays. Cada elemento de array contém um conjunto necessário que permite a um usuário com esse conjunto acessar os dados.

Em seguida, inclua a etapa $redact na operação db.collection.aggregate() para restringir o conteúdo do conjunto de resultados baseado no acesso exigido para visualizar os dados.

Para obter mais informações sobre o operador de pipeline $redact, incluindo sintaxe, variáveis de sistema associadas e exemplos adicionais, consulte $redact.

Por exemplo, uma coleção forecasts contém documentos do seguinte formulário onde o campo tags determina os níveis de acesso exigidos para visualizar os dados:

{
_id: 1,
title: "123 Department Report",
tags: [ [ "G" ], [ "FDW" ] ],
year: 2014,
subsections: [
{
subtitle: "Section 1: Overview",
tags: [ [ "SI", "G" ], [ "FDW" ] ],
content: "Section 1: This is the content of section 1."
},
{
subtitle: "Section 2: Analysis",
tags: [ [ "STLW" ] ],
content: "Section 2: This is the content of section 2."
},
{
subtitle: "Section 3: Budgeting",
tags: [ [ "TK" ], [ "FDW", "TGE" ] ],
content: {
text: "Section 3: This is the content of section3.",
tags: [ [ "HCS"], [ "FDW", "TGE", "BX" ] ]
}
}
]
}

Para cada documento, o campo tags contém vários agrupamentos de acesso necessários para exibir os dados. Por exemplo, o valor [ [ "G" ], [ "FDW", "TGE" ] ] pode especificar que um usuário exige acesso nível ["G"] ou ambos [ "FDW", "TGE" ] para visualizar os dados.

Considere um usuário que só tem acesso para visualizar informações marcadas com "FDW" ou "TGE". Para executar uma query em todos os documentos com o ano 2014 para esse usuário, inclua um estágio $redact como no seguinte:

var userAccess = [ "FDW", "TGE" ];
db.forecasts.aggregate(
[
{ $match: { year: 2014 } },
{ $redact:
{
$cond: {
if: { $anyElementTrue:
{
$map: {
input: "$tags" ,
as: "fieldTag",
in: { $setIsSubset: [ "$$fieldTag", userAccess ] }
}
}
},
then: "$$DESCEND",
else: "$$PRUNE"
}
}
}
]
)

A operação de aggregation retorna o seguinte documento "editado" para o usuário:

{ "_id" : 1,
"title" : "123 Department Report",
"tags" : [ [ "G" ], [ "FDW" ] ],
"year" : 2014,
"subsections" :
[
{
"subtitle" : "Section 1: Overview",
"tags" : [ [ "SI", "G" ], [ "FDW" ] ],
"content" : "Section 1: This is the content of section 1."
},
{
"subtitle" : "Section 3: Budgeting",
"tags" : [ [ "TK" ], [ "FDW", "TGE" ] ]
}
]
}

Veja também:

Nesta página