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