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?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using UserManager;

namespace App1stUser
{
    public partial class frmPrincipal : Form
    {
        public frmPrincipal()
        {
            InitializeComponent();
        }

        private void frmPrincipal_Load(object sender, EventArgs e)
        {            
            TPerfilUsuario p = new TPerfilUsuario();
            try
            {
                lbListaPerfil.DisplayMember = "Descricao";
                lbListaPerfil.DataSource = p.ListarTodos();
            }
            finally
            {
                p.Dispose();
            }
        }

        private void btnCriaPerfil_Click(object sender, EventArgs e)
        {
            TPerfilUsuario p = new TPerfilUsuario();
            try
            {
                p.Descricao = tbxPerfil.Text;
                for (int i = 0; i < p.Modulos.Count; i++)
                {
                    p.Modulos[i].PodeAcessar = 1;
                }
                p.Inserir();
                lbListaPerfil.DisplayMember = "Descricao";
                MessageBox.Show(p.MsgInfo);
                 lbListaPerfil.DataSource = p.ListarTodos();
             }
             finally
             {
                 p.Dispose();
             }
         }

         private void btnCriaUser_Click(object sender, EventArgs e)
         {
             TUsuario u = new TUsuario();
             try
             {
                 u.Nome = tbxLogin.Text;
                 u.Login = tbxLogin.Text;
                 u.Senha = tbxSenha.Text;
                 u.PerfilId = (lbListaPerfil.SelectedItem as TPerfilUsuario).PerfilId;
                 u.Status = "A";
                 u.Inserir();
                 MessageBox.Show(u.MsgInfo);
             }
             finally
             {
                 u.Dispose();
             }
         }

         private void btnAbreFrmTeste_Click(object sender, EventArgs e)
         {
             string msg = "";
             TUsuario u = TUsuario.Autenticar(tbxLogin.Text, tbxSenha.Text, out msg);
             wfCadUsuarios frmcaduser = new wfCadUsuarios();
             if (u != null)
             {
                 try
                 {
                     if (u.Perfil.TemAcesso(frmcaduser.Name))
                     {
                         frmcaduser.ShowDialog();
                     }
                     else
                     {
                         MessageBox.Show("Ops, sem acesso!");
                     }
                 }
                 finally
                 {
                     u.Dispose();
                 }
             }
             else
             {
                 MessageBox.Show(msg);
             }
         }
     }
}

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é!