Open Source Web Application Framework for ASP.NET Core
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

5.4 KiB

Módulo de Gerenciamento de Permissões

Este módulo implementa o IPermissionStore para armazenar e gerenciar valores de permissões em um banco de dados.

Este documento aborda apenas o módulo de gerenciamento de permissões que persiste os valores de permissão em um banco de dados. Consulte o documento de Autorização para entender os sistemas de autorização e permissão.

Como Instalar

Este módulo já vem pré-instalado (como pacotes NuGet/NPM). Você pode continuar a usá-lo como pacote e obter atualizações facilmente, ou pode incluir seu código-fonte em sua solução (consulte o comando get-source da CLI) para desenvolver seu próprio módulo personalizado.

O Código-fonte

O código-fonte deste módulo pode ser acessado aqui. O código-fonte é licenciado com a licença MIT, portanto, você pode usá-lo e personalizá-lo livremente.

Interface do Usuário

Diálogo de Gerenciamento de Permissões

O módulo de gerenciamento de permissões fornece um diálogo reutilizável para gerenciar permissões relacionadas a um objeto. Por exemplo, o Módulo de Identidade o utiliza para gerenciar as permissões de usuários e funções. A imagem a seguir mostra a página de Gerenciamento de Funções do Módulo de Identidade:

permissions-module-open-dialog

Quando você clica em Ações -> Permissões para uma função, o diálogo de gerenciamento de permissões é aberto. Uma captura de tela de exemplo deste diálogo:

permissions-module-dialog

Neste diálogo, você pode conceder permissões para a função selecionada. As abas no lado esquerdo representam os principais grupos de permissões e o lado direito contém as permissões definidas no grupo selecionado.

IPermissionManager

IPermissionManager é o serviço principal fornecido por este módulo. Ele é usado para ler e alterar os valores de permissão. IPermissionManager é normalmente usado pelo Diálogo de Gerenciamento de Permissões. No entanto, você pode injetá-lo se precisar definir um valor de permissão.

Se você apenas deseja ler/verificar os valores de permissão para o usuário atual, use o IAuthorizationService ou o atributo [Authorize], conforme explicado no documento de Autorização.

Exemplo: Conceder permissões para funções e usuários usando o serviço IPermissionManager

public class MeuServico : ITransientDependency
{
    private readonly IPermissionManager _permissionManager;

    public MeuServico(IPermissionManager permissionManager)
    {
        _permissionManager = permissionManager;
    }

    public async Task ConcederPermissaoParaFuncaoDemoAsync(
        string nomeFuncao, string permissao)
    {
        await _permissionManager
            .SetForRoleAsync(nomeFuncao, permissao, true);
    }

    public async Task ConcederPermissaoParaUsuarioDemoAsync(
        Guid idUsuario, string nomeFuncao, string permissao)
    {
        await _permissionManager
            .SetForUserAsync(idUsuario, permissao, true);
    }
}

Provedores de Gerenciamento de Permissões

O Módulo de Gerenciamento de Permissões é extensível, assim como o sistema de permissões. Você pode estendê-lo definindo provedores de gerenciamento de permissões.

O Módulo de Identidade define os seguintes provedores de gerenciamento de permissões:

  • UserPermissionManagementProvider: Gerencia permissões baseadas em usuários.
  • RolePermissionManagementProvider: Gerencia permissões baseadas em funções.

IPermissionManager usa esses provedores quando você obtém/define permissões. Você pode definir seu próprio provedor implementando o IPermissionManagementProvider ou herdando da classe base PermissionManagementProvider.

Exemplo:

public class CustomPermissionManagementProvider : PermissionManagementProvider
{
    public override string Name => "Custom";

    public CustomPermissionManagementProvider(
        IPermissionGrantRepository permissionGrantRepository,
        IGuidGenerator guidGenerator,
        ICurrentTenant currentTenant)
        : base(
            permissionGrantRepository,
            guidGenerator,
            currentTenant)
    {
    }
}

A classe base PermissionManagementProvider faz a implementação padrão (usando o IPermissionGrantRepository) para você. Você pode substituir os métodos base conforme necessário. Cada provedor deve ter um nome exclusivo, que é Custom neste exemplo (mantenha-o curto, pois ele é salvo no banco de dados para cada registro de valor de permissão).

Depois de criar sua classe de provedor, você deve registrá-la usando a classe de opções PermissionManagementOptions options class:

Configure<PermissionManagementOptions>(options =>
{
    options.ManagementProviders.Add<CustomPermissionManagementProvider>();
});

A ordem dos provedores é importante. Os provedores são executados na ordem inversa. Isso significa que o CustomPermissionManagementProvider é executado primeiro neste exemplo. Você pode inserir seu provedor em qualquer ordem na lista Providers.

Veja também