O NeoMatrix Tech está de casa nova!

Você deverá ser redirecionado em 6 segundos. Se não, visite:
http://www.leonelfraga.com/neomatrixtech
e atualize seus favoritos.

Aviso IMPORTANTÍSSIMO!

Aviso aos navegantes:

O NeoMatrix Tech mudou de casa!!!

A partir de agora, acessem pelo novo endereço:

http://www.leonelfraga.com/neomatrixtech

Ué... mas é só o domínio mudou de lugar?

R: Na verdade, não é bem assim hehe. Este domínio que você acessa agora aponta para um blog hospedado no Blogger, enquanto no novo, aponta para um blog na plataforma Wordpress, hospedagem própria, muito mais rápida e com um layout mais agradável de ler ;)

Não vou fechar este domínio igual ao que eu fiz com o NM Light (que já está 100% na nova plataforma). Talvez beeeeeeem depois eu faça isso.

Todos os posts daqui se encontram lá, e novos posts serão colocados somente no novo endereço.
A única coisa que não consegui importar foram os comentários. Mas em breve vai ter um post contando sobre a epopéia que foi migrar o NeoMatrix Tech!

Somente vou fechar a área de comentários daqui. Caso queiram comentar, favor ver o post correspondente no "Novo NeoMatrix Tech" e comentem por lá. É bem melhor! (pena que os permalinks "amigáveis para SEO" não funcionam lá, dá erro 404 e não consigo fazer a configuração funcionar. E olha que eu já vi vários artigos falando desse assunto :( ).

Quem assina o feed, já está lendo o conteúdo do novo NeoMatrix Tech!

sábado, 28 de março de 2009

Controle de Usuários para ASP.NET (e Windows Forms!) – Criando o primeiro usuário em um BD vazio

cadeado_arroba

Graças a Deus tenho recebido vários feedbacks positivos e com dúvidas a respeito do Controle de Acesso para Sistemas ASP.NET (a série de artigos mais popular do NM Tech) e isto tem me motivado e muito a continuar escrevendo!

Uma das dificuldades que me repassaram é a criação do primeiro usuário em um banco de dados vazio.

Mas não é só fazer um insert into na mão?

Infelizmente, da maneira que foi implementada, isto não é possível.

Veja como fazer (após o break!)

Para ter um “thans” de segurança a mais, implementei o campo SENHA como um BLOB, e neste BLOB será colocado o hash MD5 da senha que o usuário digitar, em sua forma binária. E convenhamos, como iremos inserir diretamente, na munheca mesmo um BLOB no banco de dados?

Para contornar este problema, fiz uma sugestão, baseando-se na nossa aplicação exemplo:

- Comentar, na masterpage, o trecho de código que faz a verificação de acesso.
- Entrar diretamente no cadastro de perfis (colocar esta página como página inicial do projeto).
- Cadastrar um perfil com todas as permissões e cadastrar um usuário neste perfil
- Descomentar o código do controle de acesso.

Pronto, uma sugestão que mais beira à POG, mas tá valendo!

Maaaaaaaaas… não é sempre que podemos fazer isso, não é?

Para facilitar as coisas, criei uma pequena aplicação Windows Forms com a qual poderão ser criados (porém não alterados, somente inserir) perfis e usuários.

screen-usermanagerwinf

Como você pode ver, é bem simples: basta digitar um perfil, clicar no botão “Criar Perfil”, digitar um usuário e uma senha e clicar em “Criar Usuário…”.

Para esta aplicação (download no final do post!), adicionei as referências da DLL do UserManager (a mesma que usamos na aplicação ASP.NET) e do Provider Firebird Client (sim, estou utilizando a versão do FB) e criei um arquivo de configuração com a string de conexão necessária.

Caso queiram utilizar a versão para SQL Server, basta trocar a DLL pela a que utiliza o SQL Server e mudar a string de conexão.

Vamos dar uma olhadinha no código desse formulário?

   1: using System;
   2: using System.Collections.Generic;
   3: using System.ComponentModel;
   4: using System.Data;
   5: using System.Drawing;
   6: using System.Text;
   7: using System.Windows.Forms;
   8: using UserManager;
   9:  
  10: namespace App1stUser
  11: {
  12:     public partial class frmPrincipal : Form
  13:     {
  14:         public frmPrincipal()
  15:         {
  16:             InitializeComponent();
  17:         }
  18:  
  19:         private void frmPrincipal_Load(object sender, EventArgs e)
  20:         {            
  21:             TPerfilUsuario p = new TPerfilUsuario();
  22:             try
  23:             {
  24:                 lbListaPerfil.DisplayMember = "Descricao";
  25:                 lbListaPerfil.DataSource = p.ListarTodos();
  26:             }
  27:             finally
  28:             {
  29:                 p.Dispose();
  30:             }
  31:         }
  32:  
  33:         private void btnCriaPerfil_Click(object sender, EventArgs e)
  34:         {
  35:             TPerfilUsuario p = new TPerfilUsuario();
  36:             try
  37:             {
  38:                 p.Descricao = tbxPerfil.Text;
  39:                 for (int i = 0; i < p.Modulos.Count; i++)
  40:                 {
  41:                     p.Modulos[i].PodeAcessar = 1;
  42:                 }
  43:                 p.Inserir();
  44:                 lbListaPerfil.DisplayMember = "Descricao";
  45:                 lbListaPerfil.DataSource = p.ListarTodos();
  46:                 MessageBox.Show(p.MsgInfo);
  47:             }
  48:             finally
  49:             {
  50:                 p.Dispose();
  51:             }
  52:         }
  53:  
  54:         private void btnCriaUser_Click(object sender, EventArgs e)
  55:         {
  56:             TUsuario u = new TUsuario();
  57:             try
  58:             {
  59:                 u.Nome = tbxLogin.Text;
  60:                 u.Login = tbxLogin.Text;
  61:                 u.Senha = tbxSenha.Text;
  62:                 u.PerfilId = (lbListaPerfil.SelectedItem as TPerfilUsuario).PerfilId;
  63:                 u.Status = "A";
  64:                 u.Inserir();
  65:                 MessageBox.Show(u.MsgInfo);
  66:             }
  67:             finally
  68:             {
  69:                 u.Dispose();
  70:             }
  71:         }
  72:  
  73:         private void btnAbreFrmTeste_Click(object sender, EventArgs e)
  74:         {
  75:             string msg = "";
  76:             TUsuario u = TUsuario.Autenticar(tbxLogin.Text, tbxSenha.Text, out msg);
  77:             wfCadUsuarios frmcaduser = new wfCadUsuarios();
  78:             if (u != null)
  79:             {
  80:                 try
  81:                 {
  82:                     if (u.Perfil.TemAcesso(frmcaduser.Name))
  83:                     {
  84:                         frmcaduser.ShowDialog();
  85:                     }
  86:                     else
  87:                     {
  88:                         MessageBox.Show("Ops, sem acesso!");
  89:                     }
  90:                 }
  91:                 finally
  92:                 {
  93:                     u.Dispose();
  94:                 }
  95:             }
  96:             else
  97:             {
  98:                 MessageBox.Show(msg);
  99:             }
 100:         }
 101:     }
 102: }

Mais simples que isso impossível…

Como você pode ver, apenas instanciei as classes, preenchi as propriedades e chamei os métodos, todos eles já conhecidos do exemplo em ASP.NET.

Lembra, como eu disse nesse post que pensava em portar para Windows Forms?

Pois é, meu querido… Este é um pequeno port, não tendo somente a funcionalidade de alteração, que pode ser facilmente implementada. O mais legal é que o controle de acesso aos formulários de uma aplicação Windows Forms é feito DA MESMA MANEIRA!!! Modificações na biblioteca UserManager: NENHUMA, ZERO.

No botão “Abrir Form de Teste” da nossa aplicação fazemos a autenticação do usuário que está digitado na caixa de texto “Login” e abrimos um formulário, chamado propositalmente de wfCadUsuarios.

Instanciamos este formulário em uma variável (no nosso exemplo, a variável frmcaduser), e passamos a propriedade Name para o método TemAcesso da classe TPerfilUsuario. Se o método retornar true, chamamos o método ShowDialog() do forumulário e caso contrário disparamos uma mensagem.

Neste caso, implementei o controle de acesso antes de abrir o formulário, diferentemente do ASP.NET que eu faço a verificação quando o form já está em processamento. Mas nada impede que seja criado um “formulário pai” e que o controle de acesso seja feito em seu evento OnLoad, e que os demais forms herdem dele.

Aplicação para criação de Usuários do “Controle de Acesso para ASP.NET” (82 KiB)

Um abraço e até!

2 comentários:

Wesley Rodrigo 30 de mar. de 2009, 13:50:00  

Leonel, vc esta de parabens...otimo post...e mais uma vez obrigado!

Leonel Fraga de Oliveira 30 de mar. de 2009, 20:39:00  

@Wesley: Valeu pelo comentário!

[]'s


Postar um comentário

Para tornar este artigo ainda mais interessante, escreva suas críticas (desde que construtivas e sem ofenças), elogios, sugestões, complementos, dúvidas, etc, etc, etc!!!

  © Blogger templates ProBlogger Template by Ourblogtemplates.com 2008 - Editado e configurado por Leonel F.

Voltar ao TOPO