Escolha uma Página
Populando Papéis (roles),usuários principais (admin,managers) e menus por papel a partir do Startup.cs do Core MVC

Populando Papéis (roles),usuários principais (admin,managers) e menus por papel a partir do Startup.cs do Core MVC

Menus

 Muitas vezes você quer pré-definir os papéis (roles) para todos possíveis usuários da sua aplicação, Bem como definir um ou mais usuários com poder administrativo geral, ou também um usuário gerenciador, com menos poderes que o administrador. Este artigo mostra como fazer isso,

Ao rodar o arquivo STARTUP.CS é perfeitamente possível gerar todos os papéis (Roles( desejados para a sua aplicação, bem como definir ao menos um usuário administrativo com superpoderes e outros usuários com menores poderes. Isso vai ajudar, depois, a definir menus seletivos, onde só aparecem opções de navegação a que cada papel (role) dá direito.

Passo 1 – Nova tabela no banco de dados

Parimos do princípio que você já tem seu database com as tabelas que necessita, conforma artigos anteriores, O que vamos precisar agora é de uma nova tabela que contenha o que o menu de cada pape (role( deve conter ou não.. Ou seja, precisamos fazer uma tabela de relacionamento entre a tabela ASP.NET Roles e nossa tabela de menu. Vamos ver em detalhes sobre como criar nossa nova Tabela de Menus que tem um relacionamento com a tabela ASP.NET Identity AspNetRoles. A ess tabela vamos dar o nome MenuMaster, com os seguintes campos:

 

Tabela MenuMaster – Campos e Descrições

MenuIdentity é o campo de identidade usado como linha de ID (KEY)
MenuID é a identidade propriamente dita usada como referência primárias para qualquer campo do Menu
Parente_MenuID para cada top  MenuID será usado o valor “*”. Esse valor serpa usado somente para itens de menu com nível igual a 1 (primeira opção por default). Se na hierarquia de menus houver níveis 2 ou 3, elas farão referência ao menu raiz *MenuID”, que são pais
User_Rool Cria o menu para cada papel de usuário (User Role). O menu serpa mostrado para os usuários que tem esse papel (role) e que estiverem logados. Por exemplo, Admin pode criar diferentes menus para gerentes, consultores e outros papéis, E somente usuários que tenham esses papéis poderão ver esses menus
MenuFileName Este é o nome real para cada opção do menu (o que aparece em tela).  A ideia qui é usar o view nMWdo MV como MenuFileName
MenuURL É o Menu path para cada item do Menu, usado como hiperlink,, Em MVCé o nome do Controlador (controller)
USE_YN Se usado Y, o item de menu vai aparecer, Se usado N, não vai aparecer,  mesmo que ateda os requisitos de papel(role), Em geral é controlado por Viewbags, que definem se em certas condições do item de menu deve ou não aparecer,
CreateDate Data de criação do item do Menu

Passo 2- Criando a tabela no banco de dados, antes de popula-la

No arquivo STARTUP.CS, acrescente em services,addIdentity a parte de código relativo a

//Seting the Account Login page
            services.ConfigureApplicationCookie(options =>
Se ao compilar o Visual Stdio reclamar que não consegue apagar um diretório na pasta OBJ da aplicação, apague manualmente e recompile novamente,

Agora vamos criar o modelo com a classe MenuMaster, na pasta Models:

Passo 3 – Gerando a tabela MASTERMENU no nosso database

Recompile a aplicação para ver se até aqui não deu qualquer erro. O resultado deve ser:

========== Build: 0 succeeded, 0 failed, 1 up-to-date, 0 skipped ==========

No Solution Explorer clique na pasta Controllers e com o botão da direita selecione ADD->New Scaffolded Item. Escolha MVC e à direita escolha MVC Controllers with Views, using Entity Framework. Clique no botão ADD.

Em Model Class escolher  o modelo MenuMaster , que ai aparecer como MenuMaster (DiagnosticoCultura.Models) . Clique no botão ADD.

Agora vamos Rodar a miração na console PMC:

add-migration mastermenu

e depois

update-database

Se compilar o programa e digitar https://localhost:44387/MenuMasters você verá que está tudo pronto para cadastrar os menus.

Passo 4 – Criando classes de interface

Agora é hora de criarmos uma interface com um método chamado GetMenuMaster() e outro método chamado GetMenuMaster (String UserRole).

Implementaremos essa interface em nosso serviço para obter todos os detalhes do menu da tabela e também outro método para obter o menu considerando o papel (ROLE) do usuário.

Para criar a interface, adicione uma nova classe à sua pasta de modelos e nomeie a classe como “IMenuMasterService”. Vamos mudar a classe para uma interface, pois vamos criar uma interface para implementar em nosso serviço

Passo 5: Criação do Serviço de Menus:

Agora vamos adicionar uma nova pasta de serviços de classe (abrir uma pasta raiz chamada Services) e nomear a classe como “MenuMasterService“.

Nesta classe, estaremos implementando nossa interface IMenuMasterService.

Sabemos que, se implementarmos a interface, devemos declarar o método de interface em nossa classe. Neste serviço, usamos o método de interface e retornamos a lista com detalhes do Menu e também retornamos os detalhes do Menu por função do usuário. Depois estaremos injetando isso diretamente em nossa página de visualização.

Passo 6: Registrando o serviço

Precisamos registrar nosso serviço criado no contêiner. Abra o Startup.cs do seu projeto para adicionar o serviço ao contêiner.

Na classe Startup.cs, encontre o método denominado ConfigureServices e adicione seu serviço “MenuMasterService” como abaixo.

Passo 7: Injetando o serviço de menus na página _Layout.cshtml

Agora, é muito mais simples e fácil, já que podemos injetar diretamente o serviço em nossa página de visualização e vincular todo o resultado à nossa página de visualização.

Para injetar o Serviço em nossa Visualização, aqui estaremos usando nossa página _Layout.cshtml existente.

Como vamos exibir o menu no topo do nosso site e usá-lo em todas as nossas páginas, aqui usamos a página _Layout.cshtml para vincular os resultados do menu como um menu baseado no usuário logado.

Aqui primeiro verificamos se o usuário está Autenticado em nosso site. Se o usuário estiver logado, obteremos os detalhes do papel do usuário conectado e vincularemos o menu com base nas funções do usuário.

Aqui no exemplo estamos vinculando 2 nível do menu como Menu Principal e Submenu.

Em nosso resultado de tabela, verificamos todos os Parenut_MenuID = ”*”, já que estaremos exibindo o menu principal com o parent_MenuID como “*” e no próximo loop interno, exibimos o submenu apropriado para o menu principal.

IMPORTANTE> Faça um backup do _Layout.cshtml ANTES de alterar qualquer coisa, Se 

Obrigado pela sua leitura. Continue visitando este blog e compartilhe artigos em sua rede de relacionamento. Por favor, se quiser, registre sugestões e comentários ao final da página.