Mapear ACLs

Para garantir que apenas usuários com acesso a um item possam vê-lo nos resultados da pesquisa, indexe os itens com as respectivas listas de controle de acesso (ACLs, na sigla em inglês) no repositório corporativo. É necessário modelar as ACLs do repositório e incluí-las ao indexar itens. O SDK do Content Connector fornece métodos para modelar as ACLs da maioria dos repositórios.

Criar uma ACL

A criação de uma ACL é um processo de duas etapas:

  1. Crie um Principal usando métodos estáticos na ACL.
  2. Use a classe Acl.Builder para criar a ACL usando o principal.

Este documento aborda conceitos para modelar e criar ACLs, como herança e contenção.

Criar um principal usando um ID externo

O Google Cloud Search exige que usuários e grupos sejam resolvidos para endereços de e-mail do Google. Ao indexar itens de repositório, os conectores de conteúdo podem não ter esses endereços de e-mail. No entanto, o SDK do Content Connector permite usar um ID externo (um ID que concede acesso a itens de repositório para um usuário ou grupo) em vez de um endereço de e-mail para indexar um item. Use o getUserPrincipal método ou o getGroupPrincipal método para criar principais que contenham IDs externos. A classe ACL inclui vários outros métodos estáticos para criar objetos Principal.

Depois de remapear a identidade de um item, é necessário reindexar os itens para que a nova identidade entre em vigor. Para mais informações, consulte Remapear identidades.

Herança de ACL

Herança de ACL refere-se à autorização para um item e um usuário específicos com base nas ACLs combinadas do item e da cadeia de herança dele. As regras para uma decisão de autorização dependem do repositório e das propriedades do item.

Definir herança

Cada item pode ter principais permitidos diretos e principais negados diretos, especificados usando os setReaders e setDeniedReaders métodos. Um principal permitido direto é um usuário identificado em uma ACL com acesso direto a um item. Um principal negado direto é um usuário identificado em uma ACL como sem acesso a um item.

Um item também pode herdar principais permitidos indiretos e negados indiretos principais usando o setInheritFrom método. Um principal permitido indireto tem acesso indireto a um item por meio da herança de ACL. Um principal negado indireto tem acesso negado por herança.

A Figura 1 mostra como usar o setInheritFrom método para herdar principais.

Desenho de conexões entre itens
Figura 1. O setInheritFrom método.

A Figura 1 representa estes controles de acesso:

  • O usuário 1 é um principal permitido direto do item A.
  • O usuário 2 é um principal permitido direto do item B.
  • O item B herda a ACL do item A.

Com base nesses controles, as regras de acesso são:

  • O usuário 1 é um principal permitido indireto do item B sem ser especificado explicitamente. O acesso é herdado do item A.
  • O usuário 2 não é um principal permitido indireto do item A.

Definir tipo de herança

Se você definir a herança usando o setInheritFrom método, também será necessário definir o tipo de herança usando o setInheritanceType método. O tipo de herança determina como uma ACL filha é combinada com uma ACL mãe. O Acl.InheritanceType implementa três tipos:

  • BOTH_PERMIT - Conceda acesso somente quando as ACLs filha e mãe permitirem.
  • CHILD_OVERRIDE - a ACL filha tem precedência sobre a ACL mãe em caso de conflito. Um usuário pode acessar a filha mesmo que a mãe negue, ou ter acesso negado à filha mesmo que a mãe permita.
  • PARENT_OVERRIDE - a ACL mãe tem precedência sobre a ACL filha em caso de conflito.

O Cloud Search avalia as cadeias de herança de ACL da folha para a raiz. A avaliação começa com a filha e as mães e pode progredir para a mãe raiz.

Por exemplo, se a filha usar CHILD_OVERRIDE e o usuário tiver acesso, o Cloud Search não precisará avaliar a mãe. No entanto, se a filha usar PARENT_OVERRIDE ou BOTH_PERMIT, o Cloud Search continuará avaliando a cadeia.

Contenção e exclusão de itens

Ao indexar um item, você pode marcá-lo como um contêiner usando o setContainer método da IndexingItemBuilder classe. Essa relação estabelece a hierarquia física e garante a exclusão adequada. Quando você exclui um contêiner, os itens contidos nele também são excluídos.

As relações de contenção são independentes das regras de herança de ACL. Por exemplo, uma pasta pode conter um arquivo para fins de exclusão, mas o arquivo pode herdar a ACL de uma pasta diferente. A exclusão de uma pasta não exclui itens que herdam a ACL dela, a menos que esses itens também estejam na hierarquia de contenção.

A Figura 2 representa estes controles de acesso:

  • O usuário 1 é um principal permitido direto do item A.
  • O usuário 2 é um principal permitido direto do item B.
  • O usuário 3 é um principal permitido direto do item C.
  • O item C herda a ACL do item A.
  • O item B nomeia o item A como o respectivo contêiner.
  • O item C nomeia o item B como o respectivo contêiner.

Com base nesses controles, as regras de acesso são:

  • O acesso indireto vem do setInheritFrom método. O usuário 1 pode acessar o item C porque ele herda do item A.
  • O acesso indireto não vem da contenção. O usuário 2 não pode acessar o item C.
Desenho de conexões entre itens
Figura 2. O setInheritFrom método em uso.

A separação da herança de ACL da contenção permite modelar muitas estruturas.

Quando você exclui um item:

  • Todos os itens que contêm o item excluído se tornam não pesquisáveis e são agendados para exclusão.
  • Todos os itens que especificam o item excluído em setInheritFrom se tornam não pesquisáveis.

Se um recurso usar setInheritFrom para um item excluído, mas não tiver um contêiner definido ou a hierarquia não contiver itens excluídos, o item permanecerá na origem de dados. Você é responsável por excluí-lo.

A Figura 3 mostra um exemplo de exclusão para uma hierarquia de itens.

Desenho de conexões entre itens
Figura 3. Como excluir um item e a herança de ACL.

A Figura 3 representa estes controles de acesso:

  • O usuário 1 é um principal permitido direto do item A.
  • O usuário 2 é um principal permitido direto do item D.
  • Os itens D e E herdam do item A.
  • O item D nomeia o item A como contêiner.
  • Os itens A e E são itens de nível de raiz.

As exclusões em cascata são feitas nas referências do contêiner. Quando você exclui o item A:

  • Todos os descendentes da referência setInheritFrom perdem o acesso.
  • Os usuários não podem mais acessar o item A.
  • O item D é implicitamente excluído e se torna inacessível.
  • O item E não é excluído, mas se torna inacessível e não pesquisável.