Controle de Usuários para ASP.NET (e Windows Forms!) – Criando o primeiro usuário em um BD vazio
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.
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:
Leonel, vc esta de parabens...otimo post...e mais uma vez obrigado!
@Wesley: Valeu pelo comentário!
[]'s
Postar um comentário