Herança de função no construtor de API de Dados

Observação

A funcionalidade do construtor de API de Dados descrita nesta seção está disponível na versão 2.0 e posterior. Para obter mais informações, consulte o que há de novo na versão 2.0.

A herança de função permite definir permissões uma vez em uma função mais ampla e ter funções mais específicas herdando automaticamente esse acesso. Sem a herança de funções, você deve repetir o mesmo bloco de permissão para cada função em cada entidade. Com a herança de funções, defina o acesso em anonymous uma vez e todas as funções mais abrangentes receberão o mesmo acesso.

A cadeia de herança

A cadeia de herança flui de menos privilegiados para os mais privilegiados:

named-role → authenticated → anonymous
Função Herda de Observações
Função nomeada (por exemplo, editor) authenticated Ou de anonymous se authenticated não estiver configurado
authenticated anonymous Aplica-se quando nenhum bloco explícito authenticated existe
anonymous (nenhum) Base da cadeia; nenhuma alternativa

A cadeia significa:

  • Se uma função nomeada não tiver nenhum bloco de permissão, o DAB procurará um bloco authenticated. Se nenhum existir, ele retorna para anonymous.
  • Se authenticated não tiver nenhum bloco de permissão, o DAB usará o anonymous bloco.
  • Se anonymous não tiver nenhum bloco de permissão, a solicitação será rejeitada com 403 Forbidden.

Como a herança é resolvida

Quando o DAB avalia uma solicitação, ele determina a função efetiva e, em seguida, percorre a cadeia de herança para encontrar um bloco de permissão:

  1. O DAB identifica a função efetiva da solicitação (por meio de cabeçalho, declarações de token ou padrões de X-MS-API-ROLE).
  2. O DAB procura em entities.<name>.permissions um bloco de permissão explícito que corresponda à função efetiva.
  3. Se nenhum bloco correspondente existir, o DAB percorrerá a cadeia: authenticatedanonymous.
  4. O primeiro bloco correspondente encontrado fornece as permissões para a solicitação.
  5. Se nenhum bloco corresponder a nenhuma função na cadeia, o DAB retornará 403 Forbidden.

Observação

O DAB avalia as permissões no contexto de exatamente uma função efetiva por solicitação. A herança de funções não combina permissões de várias funções.

Exemplos

Configuração mínima: permissão única para todas as funções

Defina uma permissão read em anonymous. Cada função,authenticated e qualquer função nomeada, herda esse acesso.

{
  "entities": {
    "Book": {
      "source": "dbo.books",
      "permissions": [
        { "role": "anonymous", "actions": [ "read" ] }
      ]
    }
  }
}

Permissões efetivas para esta configuração:

Entity: Book
    Role: anonymous        | Actions: Read
    Role: authenticated    | Actions: Read (inherited from: anonymous)
    Unconfigured roles     | Inherit from: anonymous

Configuração em camadas: acesso diferente por função

Quando você precisar de níveis de acesso diferentes por função, defina cada um explicitamente. A herança preenche apenas as funções que você não configura.

{
  "entities": {
    "Order": {
      "source": "dbo.orders",
      "permissions": [
        { "role": "anonymous",      "actions": [ "read" ] },
        { "role": "authenticated",  "actions": [ "read", "create" ] },
        { "role": "admin",          "actions": [ "*" ] }
      ]
    }
  }
}

Permissões efetivas para esta configuração:

Entity: Order
    Role: anonymous        | Actions: Read
    Role: authenticated    | Actions: Read, Create
    Role: admin            | Actions: Create, Read, Update, Delete
    Unconfigured roles     | Inherit from: authenticated

Qualquer função nomeada diferente do admin — por exemplo, viewer ou support — herda de authenticated e obtém read e create acesso.

Sem herança: totalmente bloqueada

Se anonymous não tiver nenhum bloco de permissão e nenhuma outra função na cadeia tiver uma, cada solicitação para essa entidade será rejeitada.

{
  "entities": {
    "AuditLog": {
      "source": "dbo.audit_log",
      "permissions": [
        { "role": "admin", "actions": [ "read" ] }
      ]
    }
  }
}

Nessa configuração, apenas admin pode acessar AuditLog. authenticated e anonymous não têm nenhum bloco para herdar, portanto, o DAB rejeita solicitações dessas funções com 403 Forbidden.

Importante

O DAB emite um aviso na inicialização quando funções nomeadas ou authenticated são configuradas em uma entidade, mas o provedor Unauthenticated está ativo. Quando Unauthenticated estiver ativo, essas funções nunca serão ativadas. Para obter mais informações, consulte Configurar o provedor não autenticado.

Exibir permissões efetivas

Use dab configure --show-effective-permissions para exibir as permissões resolvidas para cada entidade, incluindo quais funções herdaram de quais. Esse comando é a maneira mais rápida de verificar se a herança está funcionando conforme o esperado sem executar o mecanismo.

dab configure --show-effective-permissions

Você também pode direcionar um arquivo de configuração específico:

dab configure --show-effective-permissions --config my-config.json

Exemplo de saída:

Entity: Book
    Role: anonymous        | Actions: Read
    Role: authenticated    | Actions: Read (inherited from: anonymous)
    Unconfigured roles inherit from: anonymous

Entity: Order
    Role: admin            | Actions: Create, Read, Update, Delete
    Role: anonymous        | Actions: Read
    Role: authenticated    | Actions: Read (inherited from: anonymous)
    Unconfigured roles inherit from: authenticated

Para obter opções completas, consulte --show-effective-permissions.

Herança versus permissões explícitas

Scenario Recomendação
Todas as funções devem ter o mesmo acesso Definir uma vez em anonymous, permitir que todas as funções herdem
Usuários autenticados precisam de mais acesso do que anônimos Definir leitura anonymous, adicionar criação/atualização authenticated
Uma função nomeada precisa de acesso mais amplo do que authenticated Definir a função nomeada explicitamente; outras herdam de authenticated
Uma função nomeada precisa de menos acesso do que authenticated Definir a função nomeada explicitamente com as ações reduzidas
Uma entidade deve ser totalmente privada Conceda apenas a função nomeada específica; deixe authenticated e anonymous indefinidos.