Controle de Usuários para Sistemas ASP.NET - Parte 5 - Implementação nos Sistemas
Leonel Fraga de Oliveira 13/09/2008 22:58

Olá pessoal! Aqui estamos nós com a última parte do tutorial de como implementar um controle de acesso em um site ASP.NET. Na primeira parte, modelamos a base de dados, nas segunda e terceira partes implementamos as classes que irão manipular o controle de usuários e na quarta parte construímos sua interface web.

Nesta quinta e última parte iremos implementar nossa solução em uma página. Lembra do tutorial sobre fazer as linhas de um gridview mudarem de cor ao repousar do mouse? Vamos controlar o acesso dele por este sistema!

Mas primeiro vamos ver como é feito o login: para isso abra o arquivo Login.aspx do nosso site exemplo, que pode ser obtido através da nossa página de suporte do link para download no final da postagem. Nele temos apenas dois textboxes, onde informaremos o nosso login e senha e um botão para efetuar o login.

Importante: No Banco de dados alguns dados já devem ser pré-cadastrados, tais como todas as páginas web que compõem o sistema, exceto as páginas de login e o aviso de não permitido; um perfil com acesso a todas as páginas do sistema E suas respectivas ligações na tabela PERFIL_MODULOS e um usuário com este perfil.

Agora já dá para começar a brincadeira :-)

Vamos examinar o código do evento OnClick do botão btnLogin:

protected void btnLogin_Click(object sender, EventArgs e)
{ 
    string msg = "";
    TUsuario u = TUsuario.Autenticar(tbLogin.Text, tbSenha.Text, out msg);
    if (u != null)
    {
        Session.Add("USUARIO", u);
        Response.Redirect("Default.aspx");
    }
    else
    {
        ScriptManager.RegisterStartupScript(this, this.GetType(), "alerta", Consts.JavaScript.Alert(Consts.Funcoes.Replacer4js(msg), false), true);
    }
}

Verificamos que esse código é bem simples: Chamamos o método estático Autenticar da classe TUsuario. Passamos neste método um login, uma senha e uma variável que irá capturar a mensagem de retorno, se o login foi bem sucedido ou não.

Se a autenticação for bem sucedida, o método retorna uma instância de TUsuario, que contém todos os dados do mesmo e do perfil, inclusive cada página que ele possui acesso, caso contrário, retornará null.

Em seguida verificamos esse retorno. Se for diferente de null, a instância de TUsuario retornada será armazenada em uma variável de sessão chamada USUARIO e em seguida é feito o redirecionamento para a página padrão do sistema. Se for null, é disparada uma mensagem através de um alert em javascript (a função Consts.JavaScript.Alert é um "wrapper" para o comando alert; ele monta uma string com esse comando e a mensagem, e a função Consts.Funcoes.Replacer4js faz o escape de caracteres especiais do JS, por exemplo, para que o renderizador entenda que "n" não é para quebrar a linha, e sim escrever a string "n" na página).

Vamos fazer a verificação em cada página agora :-D ?

Para fazer esta verificação, precisamos pegar somente o nome da página que está sendo carregada e ver se este nome existe dentro da propriedade Perfil.Modulos de nossa variável de sessão USUARIO. Isto é feito através do método TemAcesso, que varre a coleção Perfil.Modulos:

//Verifica se o usuário terá acesso a esta página
if (Session["USUARIO"] == null)
{
    Response.Redirect("naopermitido.aspx");
}
else
{
    TUsuario u = (TUsuario)Session["USUARIO"];
    lbInfo.Text = "Usuário:" + u.Nome + "  Perfil" + u.Perfil.Descricao;
    if(!u.Perfil.TemAcesso(Consts.Funcoes.FormName(Request.Url.AbsolutePath)))
    {
        Response.Redirect("naopermitido.aspx");
    }
}

Este bloco de código se encontra nas primeiras linhas do método Page_Load(), de modo que ele primeiro verifique o perfil e somente depois carregue as outras informações.

Se a nossa variável de sessão USUARIO for nula, significa que quem tentou acessar a página (caso tenha tentado fazer o acesso sem passar pela página de login) não está logado, e imediatamente redirecionamos para a página que indica "Acesso não permitido".

Caso o usuário esteja devidamente logado em nosso sistema, passamos somente o nome do formulário .aspx para o método Perfil.TemAcesso de nossa variável de sessão. A propriedade Request.Url.AbsolutePath retorna a URL completa. Passaremos ele para a função Consts.Funcoes.FormName, que nos retornará apenas o nome a página.

Se o método de verificação de acesso returnar true, o carregamento da página tem continuidade, caso contrário, o usuário é redirecionado para a página "naopermitido.aspx".

Beleza, muito simples. Mas se o sistema for grande, preciso colar este código em TODAS as páginas?

Aí vai depender de como o seu site foi construído. Se ele utilizar o .NET Framework 2.0 (duh, as classes são estritamente para o FW 2.0, visto que ele faz uso de Generic List... Mas, ele também pode ser implementado com o Framework 1.x também, alterando os Lists para ArrayList)  e utilizar master pages (que faz herança visual E de código no ASP.NET) , este código somente precisa ser colocado na(s) master page(s) do site. Caso contrário, terá que ser um a um.

Porém esse método apresenta uma desvantagem devido ao fluxo de execução e renderização da página: Primeiro, são executados todos os eventos da página "filha", por exemplo, o Page_Load e o método de postback invocado, para só aí executar o código da master page e a renderização da página em si. Com isso, caso tenha alguma carga de dados no evento PageLoad, esta será executada primeiro em relação à verificação de permissão de acesso.

Exemplo Sistema de Login em ASP.NET (com BD Firebird)  (289 kB)

Enfim, terminou! Um grande abraço a todos e espero que tenham aproveitado! :-)

[Update 26/02/2008: Para facilitar o download, ao invés da página de suporte hospedada no Geocities, estarei movendo os arquivos para hospedagem própria, diretamente no domínio leonelfraga.com e colocando os links diretos para o arquivo.]

[Update 14/12/2010 (sim, tanto tempo assim!): Corrigi os links do site. Como são links internos, consegui recuperá-los. Estavam quebrados devido a migração do blog... Valeu Thiago!]

Leonel Fraga de Oliveira Leonel Fraga de Oliveira é formado em Processamento de Dados na Faculdade de Tecnologia de São Paulo (FATEC-SP - 2002) e anteriormente em Técnico em Eletrônica, pela ETE Professor Aprígio Gonzaga (lá em 1999).
Atualmente trabalha como Analista de Sistemas na Prefeitura Municipal de São Caetano do Sul - SP
Tem como hobbies DJing (também trabalha como DJ freelancer) e ciclismo, além da manutenção dos sites NeoMatrix Light e NeoMatrix Tech.
Gosta de música eletrônica, tecnologia, cinema (super fã de Jornada nas Estrelas), gastronomia e outras coisas mais.


Compartilhe nas redes sociais

   

Deixe seu comentário

comments powered by Disqus