Filtros de segurança para cortar resultados em Azure Cognitive Search

Pode aplicar filtros de segurança para cortar os resultados da pesquisa em Azure Cognitive Search com base na identidade do utilizador. Geralmente, esta experiência de pesquisa requer a comparação da identidade de quem pede a pesquisa com um campo que contém os principais que têm permissões para o documento. Quando é encontrada uma correspondência, o utilizador ou principal (como um grupo ou função) tem acesso a esse documento.

Uma forma de alcançar a filtragem de segurança é através de uma disjunção complicada de expressões de igualdade: por exemplo, Id eq 'id1' or Id eq 'id2', etc. Esta abordagem é propensa a erros, é difícil de manter e, nos casos em que a lista contém centenas ou milhares de valores, reduz o tempo de resposta da consulta em muitos segundos.

Uma abordagem mais simples e rápida é através da search.in função . Se utilizar search.in(Id, 'id1, id2, ...') em vez de uma expressão de igualdade, pode esperar tempos de resposta de sub-segundo.

Este artigo mostra-lhe como realizar a filtragem de segurança com os seguintes passos:

  • Criar um campo que contenha os identificadores principais
  • Enviar ou atualizar documentos existentes com os identificadores principais relevantes
  • Emitir um pedido de pesquisa com search.infilter

Nota

O processo de obtenção dos identificadores principais não está abrangido neste documento. Deve obtê-la a partir do seu fornecedor de serviços de identidade.

Pré-requisitos

Este artigo pressupõe que tem uma subscrição do Azure, um serviço Azure Cognitive Search e um índice.

Criar campo de segurança

Os seus documentos têm de incluir um campo que especifique os grupos que têm acesso. Estas informações tornam-se os critérios de filtro em relação aos quais os documentos são selecionados ou rejeitados no conjunto de resultados devolvido ao emissor. Vamos supor que temos um índice de ficheiros protegidos e que cada ficheiro é acessível por um conjunto diferente de utilizadores.

  1. Adicione o campo group_ids (pode escolher qualquer nome aqui) como .Collection(Edm.String) Certifique-se de que o campo tem um filterable atributo definido como para true que os resultados da pesquisa sejam filtrados com base no acesso que o utilizador tem. Por exemplo, se definir o group_ids campo ["group_id1, group_id2"] como para o documento com file_name "secured_file_b", apenas os utilizadores que pertencem a IDs de grupo "group_id1" ou "group_id2" têm acesso de leitura ao ficheiro.

    Certifique-se de que o atributo do retrievable campo está definido como para false que não seja devolvido como parte do pedido de pesquisa.

  2. file_id Adicione também campos e file_name para efeitos deste exemplo.

    {
        "name": "securedfiles",  
        "fields": [
            {"name": "file_id", "type": "Edm.String", "key": true, "searchable": false, "sortable": false, "facetable": false},
            {"name": "file_name", "type": "Edm.String"},
            {"name": "group_ids", "type": "Collection(Edm.String)", "filterable": true, "retrievable": false}
        ]
    }
    

Enviar dados por push para o índice com a API REST

Emita um pedido HTTP POST para o ponto final de URL do índice. O corpo do pedido HTTP é um objeto JSON que contém os documentos a adicionar:

POST https://[search service].search.windows.net/indexes/securedfiles/docs/index?api-version=2020-06-30  
Content-Type: application/json
api-key: [admin key]

No corpo do pedido, especifique o conteúdo dos seus documentos:

{
    "value": [
        {
            "@search.action": "upload",
            "file_id": "1",
            "file_name": "secured_file_a",
            "group_ids": ["group_id1"]
        },
        {
            "@search.action": "upload",
            "file_id": "2",
            "file_name": "secured_file_b",
            "group_ids": ["group_id1", "group_id2"]
        },
        {
            "@search.action": "upload",
            "file_id": "3",
            "file_name": "secured_file_c",
            "group_ids": ["group_id5", "group_id6"]
        }
    ]
}

Se precisar de atualizar um documento existente com a lista de grupos, pode utilizar a ação merge ou mergeOrUpload :

{
    "value": [
        {
            "@search.action": "mergeOrUpload",
            "file_id": "3",
            "group_ids": ["group_id7", "group_id8", "group_id9"]
        }
    ]
}

Para obter detalhes completos sobre como adicionar ou atualizar documentos, pode ler Editar documentos.

Aplicar o filtro de segurança

Para cortar documentos com base no group_ids acesso, deve emitir uma consulta de pesquisa com um group_ids/any(g:search.in(g, 'group_id1, group_id2,...')) filtro, em que "group_id1, group_id2,..." são os grupos aos quais o emissor do pedido de pesquisa pertence.

Este filtro corresponde a todos os documentos para os quais o group_ids campo contém um dos identificadores especificados. Para obter detalhes completos sobre como procurar documentos com Azure Cognitive Search, pode ler Procurar Documentos. Tenha em atenção que este exemplo mostra como procurar documentos com um pedido POST.

Emita o pedido HTTP POST:

POST https://[service name].search.windows.net/indexes/securedfiles/docs/search?api-version=2020-06-30
Content-Type: application/json  
api-key: [admin or query key]

Especifique o filtro no corpo do pedido:

{
   "filter":"group_ids/any(g:search.in(g, 'group_id1, group_id2'))"  
}

Deverá obter os documentos onde group_ids contém "group_id1" ou "group_id2". Por outras palavras, obtém os documentos aos quais o emissor do pedido tem acesso de leitura.

{
 [
   {
    "@search.score":1.0,
     "file_id":"1",
     "file_name":"secured_file_a",
   },
   {
     "@search.score":1.0,
     "file_id":"2",
     "file_name":"secured_file_b"
   }
 ]
}

Passos seguintes

Este artigo descreveu um padrão para filtrar resultados com base na identidade do utilizador e na search.in() função. Pode utilizar esta função para transmitir identificadores principais para que o utilizador requerente corresponda aos identificadores principais associados a cada documento de destino. Quando um pedido de pesquisa é processado, a função filtra os search.in resultados da pesquisa para os quais nenhum dos principais do utilizador tem acesso de leitura. Os identificadores principais podem representar elementos como grupos de segurança, funções ou até mesmo a própria identidade do utilizador.

Para obter um padrão alternativo baseado no Active Directory ou para rever outras funcionalidades de segurança, veja as seguintes ligações.