UserControl

Dê permissões aos usuários do sistema

Sempre teremos a necessidade de controlar as permissões dos usuários dos nossos sistemas. Para isso devemos ter tabelas como: usuários, permissões, entre outras necessidades que dispensam uma grande quantidade de código.

Pensando nisso foi criado o UserControl que realiza toda essas tarefas, criação das tabelas no banco de dados, controle de permissões do usuário, envio de e-mail para o usuário que esquece a senha (muito comum nos sites), ou que alterou a senha, entre outras muitas facilidades.

O componente esta em uma versão beta, mas nos testes realizados funcionou muito bem. O componente acessa vários banco de dados através das tecnologias, entre elas: ADO, DBX, IBX, IBO, Zeos. O componente é freeware e com o código fonte incluso.

Download e Instalação

Faça o download do arquivo no endereço flow.dl.sourceforge.net/sourceforge/usercontrol/UserControl181.zip e descompacte num diretório de sua preferência. Abra o arquivo UserControls.dpk (veja Figura 1) que está no diretório \Source. Como falamos anteriormente o componente é beta e esta em fase de testes, durante os testes realizados ocorreram dois problemas que vamos solucionar antes de instalar o componente. Os dois problemas estão relacionados quando o usuário esquece a senha e deseja recebe-la por e-mail.

image
Figura 1. Pacote de instalação do UserControls

Alterando o código do componente

O primeiro erro ocorre quando utilizamos o componente DBXUserControl que acessa o banco através do dbExpress. Abra o arquivo DBXUserControl.pas e localize o método ActionEsqueceuSenha e altere o código a seguir:


if Query.RecordCount > 0 then
Substituir por:
if not Query.IsEmpty then

O erro ocorre por que o cursor do dbExpress é unidirecional, e a chamada ao método RecordCount realiza uma varredura na query do inicio ao fim.

Vamos ao segundo problema, a função que retorna os valores de login, nome do usuário e senha, tem um bug e retorna sempre vazia, vamos altera-la para obtermos os valores corretos.

Abra o arquivo UCMail.pas e localize a função ParseMailMSG que esta na classe TmailUserControl. Apague ou comente o código que esta na função e adicione o seguinte código:


var
  dados : TStringList;
begin
  dados := TStringList.Create;
  dados.Add('Nome do Usuário: '+ Nome);
  dados.Add('Login: '+ Login);
  dados.Add('Senha: '+ Senha);
  dados.Add('E-mail: '+ Email);
  dados.Add('Perfil: '+ Perfil);
  Result := dados.Text; 
end;

Com essa função retornamos os valores que serão enviados por e-mail ao usuário que esqueceu a senha. Salve o pacote e clique no botão Compile e depois em Install.

Será instalada a paleta User Controls (veja Figura 2). As tecnologias de acesso a dados nativos do componente são ADO, DBX, IBX e BDE. Para as outras que o componente suporta (IBO, Zeos, entre outras), devem ser instalados os respectivos pacotes que estão no mesmo diretório.

Vale lembrar que para realizar a instalação desses pacotes você necessita ter os componentes das tecnologias instalados na máquina.

Não esqueça da adicionar o path (DiretórioDescompactado\Source) dos arquivos no Library Path (Tools>Environment Options|Library) do Delphi.

image
Figura 2. Paleta instalada no Delphi

Criando um exemplo

Crie um novo projeto no Delphi, adicione um MainMenu, um SQLConnection, um DBXUserControl e um MailUserControl (usaremos nesse exemplo dbExpress, mas pode ser feito com qualquer outro tipo de acesso a dados). Abra o editor de menu do MainMenu e adicione os itens conforme a Figura 3.

image
Figura 3. Adicionando itens ao menu do exemplo

Através do IBConsole ou outra ferramenta de administração do Interbase, crie um banco de dados sem nenhuma tabela, conforme o código a seguir:


CREATE DATABASE 'UserControl.gdb'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE = 1024
DEFAULT CHARACTER SET WIN1252

Veja na Figura 4 o banco criado, sendo que não possui nenhuma tabela. As tabelas de controle de permissões e cadastro de usuários serão criadas pelo próprio componente. Aponte o SQLConnection para o banco de dados recém criado.

image
Figura 4. Banco de dados criado

Configurando o componente

Agora vamos configurar o componente que controlará os usuários do nosso exemplo. Aponte a propriedade Connection do DBXUserControl para o SQLCOnnection, a propriedade MailUserControl para o componente de mesmo nome. Nas propriedades MenuCadastroUsuario, MenuPerfilUsuario e MenuTrocaSenha você deve apontar para os respectivos menus criados anteriormente.

Com isso não precisamos nos preocupar com a criação desses formulários, o componente se encarrega de exibir formulários de troca de senha, cadastro de usuários e de perfil. Na propriedade LogControl.Active altere para True e aponte o menu de Log na propriedade LogControl.MenuLog.

Se você utiliza o componente ActionList nos seus projetos, você pode utiliza-lo junto com o componente através da propriedade ActionList. Altere para True a propriedade ForcePassword e Tentativas digite 3. Como podemos notar essa propriedade indica quantas tentativas o usuário pode fazer no login.

Na propriedade Settings estão todas as propriedades dos formulários que o componente possui, sendo possível alterar até mesmo o rótulo de botões (veja Figura 5).

image
Figura 5. Configurações até de rótulos dos botões

Enviando e-mail

Outra facilidade que o componente nos trás, é a possibilidade de enviar e-mail ao usuário em diversas situações, como: esquecer a senha, alterar a senha, tentativas de login, entre outras. No componente MailUserControl, configure as propriedades EmailRemetente, NomeRemetente, Senha, ServidorSMTP e Usuario com os dados de sua conta de e-mail.

Agora basta configurar as propriedades AdicionaUsuario, AlterarUsuario, EsqueceuSenha, SenhaForcada e SenhaTrocada com o texto (propriedade Mensagem) e o assunto do e-mail (propriedade Titulo).

Pronto, quando o usuário realizar qualquer uma dessas situações lhe será enviado um e-mail, o qual deve estar cadastrado nos dados do usuário.

Controlando Permissões

Vamos rodar a aplicação para criarmos usuários e dar permissões aos mesmos. Note que no primeiro login é mostrada uma caixa de mensagem com o usuário Admin e a senha #delphi. Digite esses valores no formulário de login e clique em Ok (veja na Figura 6). Veja que somente o menu com os itens de troca de senha, adicionar usuários esta habilitado, isso é por que não dissemos quais os menus esse usuário pode acessar.

image
Figura 6. Tela de login

Clique no item que adiciona os usuários, e veja que uma tela de cadastro aparece (veja na Figura 7) para adicionar usuários, dar permissões aos mesmos, criar perfil. Vamos criar um novo usuário, clicando no botão Adicionar, a tela de cadastro é aberta (veja na Figura 8), onde adicionamos os dados do usuário, podemos também informar um perfil para o usuário.

image
Figura 7. Controle de usuários do sistema
image
Figura 8. Cadastro de usuários

Após criar o usuário clique no botão Gravar, o componente gera uma senha aleatória onde você pode confirmar ou alterar (veja na Figura 9). Após a confirmação da senha o componente envia um e-mail para o usuário informando que o mesmo foi adicionado no cadastro de usuários (veja na Figura 10).

image
Figura 9. Senha gerada pelo componente
image

Figura 10. E-mail informando que o usuário foi adicionado

Figura 8. Cadastro de usuários

No formulário de controle dos usuários, clique no botão Acessos, nessa tela é onde iremos dar as permissões ao usuário através do acesso aos itens dos menus (veja na Figura 11).

image

Figura 11. Controle de permissões do usuário

Figura 8. Cadastro de usuários
Nota: Não esqueça de marcar o primeiro item do menu, senão mesmo que você marque um item interno, o item superior não ficará habilitado.

Clique no botão Gravar para confirmar as permissões do usuário.

Criação das tabelas do banco

Você pode estar perguntando, onde esta sendo armazenado esses dados, já que criamos apenas o banco de dados, mas nenhuma tabela foi criada. Abra o banco de dados e veja que o componente criou as tabelas para nós (veja na Figura 12). O controle dessas tabelas é feito pelo componente, de acordo com o tipo de acesso. Faça um teste com outro UserControl e veja que a criação das tabelas é feita automaticamente pelo componente.

image
Figura 12. Tabelas criadas pelo componente
Nota: Abra a tabela UCCADUSER e visualize os dados dos usuários. Note que o campo senha está com o valor criptografado, aumentando a segurança das informações dos usuários do sistema (veja Figura 13).
image
Figura 13. Senha do usuário fica criptografada no banco de dados

Testando as permissões

Feche o projeto e abra-o novamente, só que dessa vez faça o login com o usuário criado anteriormente. Note que os itens do menu estão habilitados somente os que foram marcados no controle de permissões (veja na Figura 14).

image
Figura 14. Menus habilitados de acordo com a permissão do usuário

No menu de alterar a senha, um formulário pede a senha atual e uma nova senha, juntamente com uma confirmação. Após inserir os dados, clique no botão Gravar. Serão confirmados os dados no banco e será enviado um e-mail informando que a senha foi alterada (veja Figura 15).

image
Figura 15. E-mail informando que a senha do usuário foi alterada

Você pode adicionar perfis aos usuários, sendo que esses perfis podem ter determinado acesso. Assim quando você adicionar um usuário e lhe der um perfil, o acesso que esse perfil possui já estará configurado no controle de acessos do usuário.

Feche e abra novamente o exemplo e digite o nome do usuário na tela de login e clique no rótulo Esqueci a senha. Nesse momento o componente envia um e-mail para o usuário com as informações de seu login (veja Figura 16).

image
Figura 16. Informações do login do usuário, enviadas por e-mail

Teste também a tentativa de login com a senha incorreta, quando a quantidade de tentativas for igual ao valor que esta configurada na propriedade Tentativas, o projeto é fechado e enviado um e-mail ao usuário dizendo que foi feita uma tentativa de login forçado com o seu nome de usuário (veja Figura 17).

image
Figura 17. E-mail informando que tentaram efetuar login com os dados do usuário

Todas essas informações enviadas por e-mail são importantes para manter a segurança do projeto, assim o usuário fica sabendo de tudo que envolve os seus dados.

Conclusões

Vimos que temos um componente, que mesmo sendo beta, é muito poderoso, pois realizamos o exemplo sem uma linha de código, criando também tabelas no banco de dados. As alterações realizadas no inicio do artigo foram enviadas aos criadores do componente, ou seja, ajudamos no desenvolvimento do componente.

O componente ainda possui demos de todas as tecnologias de acesso a dados suportadas, que estão na pasta \Demos.

Um grande abraço a todos e até a próxima.