Permissões de usuário no delphi 7 usando zeos e mysql

04/05/2018

0

Olá gente, preciso da ajuda de vcs.

Meu sistema do tcc já está autenticando usuários pelo LOGIN e SENHA que está na tabela de cad_usuarios do meu banco no entanto nessa tabela também está a coluna de permissoes onde só pode ser registrado ADMINSITRADOR que tem controle total do sistema e USUÁRIO que tem algumas restrições. Quando o usuário logar com permissão de usuário alguns botões do form principal vão estar com a propriedade enabled com false. Utilizei parâmetros para realizar o login pesquisando na internet (ainda não manjo muito de parâmetros do delphi e Zeos) gostaria que quando um usuário tal fizesse login e tivesse como permissão usuário, quando o form principal fosse aberto esses botões estivessem desativados e no status bar recebesse o texto "Permissões de USUÁRIO" ou adminsitrador que tem controle total do sistema. Não consegui fazer essa parte, se alguém puder me ajudar eu agardeço ;-)

Sistema de controle de Estoque para TCC
Luiz Silva

Luiz Silva

Responder

Post mais votado

04/05/2018

Boa tarde Luiz Silva,
Existem ferramentas que proveem esta solução, mas não me utilizo delas, por isso criei uma solução bem interessante no meu projeto, para tal, tive que criar outras tabelas no meu banco de Dados para esta finalidade acontecer de forma perfeita. Utilizo 3 tipos de autenticações do usuário: 1) A primeira é a de Login e User, a qual já está funcionando no seu sistema. 2) A segunda é o acesso aos formulários. Dependendo do perfil do ator, nem acesso ele possuirá ao form. 3) e a última, é o acesso aos dos botões dos formulários (Novo, Salvar, Alterar e Excluir). A coisa ocorre de forma que o ator (usuario final) nem sabe porque os botões "Novo", "Alterar", "Consultar" e "Excluir", ou apenas, "Novo", ou "Novo" e "Alterar", (e assim sucessivamente até a combinação terminar) de determinado formulário estão inativos para ele (mas isso também poderia ser informado ao usuario caso você queira). Vou dividir a dinâmica lógica em passos de simples compreensão, depois se te interessar, podemos começar a falar em "códigos".

NO BANCO DE DADOS...
PASSO 1. AUTENTICAÇÃO LOGIN / SENHA no banco de Dados.
Essa solução você já possui, então dispensa comentários.
Detalhe: Nesta tabela de Usuários, possuo um atributo chamado "perfil" que se relaciona com a tabela "Perfil"

PASSO 2. A TABELA PERFIL
Criei uma tabela chamada "perfil" que possue apenas 3 campos (id, idPermissão, descrição). Aqui você já percebeu que "idPermissão" é chave estrangeira.

PASSO 3. A TABELA PERMISSÃO
Esta tabela "permissão" possui os campos (id, descrição, e o CRUD, ou seja, Create (Novo), Read (Consultar), Update (Alterar), Delete (Excluir)) representando todos os botões de funcionalidade com o banco de dados do form.

PASSO 4. A TABELA ACESSO
Esta tabela também se relaciona com a tabela "Perfil" e com a tabela "Forms", mas desta vez, ela é que possui as chaves estrangeiras "idPerfil". veja os campos: (id, idForm, idPerfil)

PASSO 5. A TABELA FORMS
Esta tabela possui os campos: (id, nome e descrição) aqui serão relacionados os nomes de todos os formulários do projeto.

NO DELPHI...
PASSO 1. LOGIN DE ACESSO AO SISTEMA:
Em primeiro lugar, minha tela de login do sistema chama a validação de usuarios, depois de logado, crio uma variável global que permanece instanciada enquanto o usuário não for alterado no sistema.

PASSO 2. AUTORIZAÇÃO DO ACESSO AOS FORMULÁRIOS:
Criei uma função em uma unit separada (ou você pode fazer no form base, caso se utilize de herança visual) que verifica a cada abertura de formulários, se aquele usuário está autorizado a abrir aquele formulário, que é chamada toda vez que o sistema for abrir um formulário. Coisa simples:
 //----Testar a permissão (por Função)---
   if testarpermissao('frmpessoas') = false then Exit;
 //----chamando o formulário (por função)----
  CriarForm(frmPessoas, TfrmPessoas);


PASSO 3. Criei uma outra função com parametros chamada "acesso" que verifica a permissão para habilitar os botões. Ela é invocada no evento "onShow" de cada form que utiliza o crud.
//chamando a funcao de permiso
  Acesso(APermissao);

Ahh... Também guardo a variavel "APermissão" quando o usuario é logado.

Para encerrar, perceba que tenho um menu de administração de usuários dentro do sistema que pode manipular todas essas permissões e perfis, de acordo com a vontade do ADMINISTRADOR.

Qualquer dúvida, pergunte aí.
Fica com Deus!

Wilton Santos

Wilton Santos
Responder

Mais Posts

04/05/2018

Wilton Santos

veja aí ideia Lógica das tabelas e suas relações:
https://1drv.ms/u/s!AuMwQdgNzBkeh84Tcqjb1f8bi02jag
Responder

07/05/2018

Luiz Silva

Muito obrigado Wilton, desculpe a demora em responder. Essa solução é excelente! via banco de dados. Queria te perguntar também uma coisa. O meu sistema está validando usuários via parâmetros do componente zquery da tela de login ele dá um select na tabela cad_usuarios e os parametros recebem o que foi digitado nos edits na tela de login. Se record count > 0 entao ele valida senão da uma mensagem que o usuario é inválido. Lá na tabela de usuarios tem um atributo chamado permissoes onde via combobox o administrador pode cadastrar ADMINISTRADOR ou USUÁRIO.

Minha dúvida e a seguinte, na hora do select e na comparação via parâmetro gostaria que trouxesse também a permissao do usuário ou seja se for USUÁRIO entao o formprincipal.bt_contas.enabled:=false;
formpessoas.bt_excluir.enabled:=false; que são restrições que o usuário vai ter e só o ADMINISTRADOR terá permissão e assim por diante só que a permissão do usuário não é digitada no login na hora da validação para ser comparada como o login e senha e recebida num parametro.

Que tipo de lógica pode ser aplicada ou código no DELPHI?
Responder

07/05/2018

Wilton Santos


Bom Luiz, eu nao faria dessa forma, mas se eu entendi bem sua pergunta, a resposta é simples:
Quando você faz sua verificação com o recordCount deverá também verificar os dados deste atributo permissões que você possui na base. Exemplo:
If ((recordCount >0) and (suaQry.fieldbyname(‘permissao’).asString<>’administrador’)) then
Begin
//Faça o que você quiser
End;

Estamos às ordens.
Responder

20/11/2020

Marjonio

Wilton Santos bom dia gostaria que o professor postasse todo esse código mas detalhado,pois,achei bastante interessante fazer essa rotina na minha aplicação,se o amigo poder enviar para o meu e-mail marjonio41@gmail.com ou postar toda rotina agradeço.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar