Fórum Controle de Acesso a Usuários em Aplicação Comercial #424229
20/09/2012
0
Boa Noite(Dia/Tarde).
Bom, estou desenvolvendo determinado projeto, e no decorrer da elaboração do mesmo surgiram algumas dúvidas relacionadas aos processos que podem ser utilizados para efetuar o Controle de Acesso dos usuários da aplicação.Após extensiva pesquisa pela internet e seus forúns pude perceber que aparentemente não existe nenhum consenso sobre alguma metodologia que pode ser utilizada para a implementação deste feature no software. Na realidade acabei ficando com ainda mais dúvidas sobre como trabalhar a idéia.
Bom, vamos lá. O que eu preciso é o seguinte, no meu projeto eu quero que os usuários tenham permissões sobre o que podem ou não fazer no sistema. Ficando a critério de um usuário com mais permissões realizar esta configuração.Mas eu não desejo um controle de acesso dos usuários apenas a nível de formuários, digamos, eu não quero que se um usuário não puder cadastrar clientes, ele não seja capaz de abrir o formulário de clientes, afinal talvez o mesmo tenha permissão para visualizar, ou alterar.
Eu preciso que o controle de acesso não seja baseado apenas a nível de formuários, mas sim a nível de rotinas. Um usuário pode ter acesso ao formulário de contas a receber e não ter permissão para relizar uma baixa de um documento.
Enfim, eu quero poder controlar quais módulos o usuário pode acessar, e acima de tudo, o que ele pode realizar naquele módulo.
Uma alternativa que analisei foi o uso de ActionManagers, ou ActionLists, conforme verifiquei em um material da DevMedia. No entanto achei a metodologia válida apenas para controle de telas, mas não de rotinas que serão acionadas pelos usuários, uma vez que tenham acessado os formulários.Outra alternativa que verifiquei foi o uso de um componente chamado UserControlPackage (http://code.google.com/p/usercontrolpackage/), pareceu interessante, no entanto o projeto foi levado apenas até o Delphi 7. Até tentei instalar o mesmo aqui mas são muitos conflitos devido a grande diferença de versões (trabalho com o Delphi 2010).
Até onde sei terei que armazenar no banco formulários e permissões sobre o que cada um pode realizar no banco. Mas como efetuar o controle dos bloqueios mais específicos, por exemplo de uma rotina de um botão isolado no formulário, e que não existe nos demais forms?
O que eu gostaria de saber é o seguinte, quais são os métodos utilizados por aqueles que possuem algum sistema, a fim de controlar os acessos dos usuários dentro da aplicação?
Agradeço imensamente aqueles que puderem compartilhar um pouco do seu conhecimento.
Att.
Arthur de Andrade
Thebluemonkey
Curtir tópico
+ 0Post mais votado
20/09/2012
Eu tenho a tabela de usuário, a tabela de classes de acesso e a tabela de permissões.
Nessa tabela de permissões fica armazenado tudo que o usuário logado não pode fazer no sistema.
No onCreate do datamodule eu carrego todos os acessos do meu sistema, e em cada lugar no programa que eu preciso verificar a classe eu faço um select no banco verificando se a classe de acesso do usuário logado tem permissão pra fazer tal operação.
No login do sistema eu carrego a classe de acesso do usuário logado.
Fiz um exemplo do jeito que eu trabalho.
Quando incluir uma nova funcionalidade no software e essa precisar de controle de acessos é só ir na função CarregaAcessos do DataModule e inserir ali, depois é só ir na tela Permissões e marcar sim ou não para classe de acesso selecionada.
[url]www.cdnweb.com.br/projeto_acesso.rar[/url]
Me fala o que você acha.
Claudia Nogueira
Gostei + 1
Mais Posts
20/09/2012
Joel Rodrigues
Ao meu ver, você poderia usar o mesmo raciocínio para realizar o controle de ações dentro do formulário usando ActionList. A estrutura seria mais ou menos essa:
-Listar formulários (itens do menu principal)
--Para cada formulário, listar as Actions.
O usuário teria então a possibilidade de definir a permissão de acesso a um item do menu principal, ou às ações de cada formulário.
Ao abrir cada form, você precisaria verificar se o usuário tem acesso a cada Action.
Bom, é apenas uma ideia.
Boa sorte.
Gostei + 0
21/09/2012
Claudia Nogueira
Eu tenho a tabela de usuário, a tabela de classes de acesso e a tabela de permissões.
Nessa tabela de permissões fica armazenado tudo que o usuário logado não pode fazer no sistema.
No onCreate do datamodule eu carrego todos os acessos do meu sistema, e em cada lugar no programa que eu preciso verificar a classe eu faço um select no banco verificando se a classe de acesso do usuário logado tem permissão pra fazer tal operação.
No login do sistema eu carrego a classe de acesso do usuário logado.
Fiz um exemplo do jeito que eu trabalho.
Quando incluir uma nova funcionalidade no software e essa precisar de controle de acessos é só ir na função CarregaAcessos do DataModule e inserir ali, depois é só ir na tela Permissões e marcar sim ou não para classe de acesso selecionada.
[url]www.cdnweb.com.br/projeto_acesso.rar[/url]
Me fala o que você acha.
Esqueci de mencionar que fiz o exemplo usando Delphi7 com Firebird 2.0. O BD está na mesma pasta do projeto, e para acesso ao sistema tem dois usuários cadastrados. SV que está sem senha e VENDEDOR com senha 1234.
Gostei + 0
21/09/2012
Thebluemonkey
Ao meu ver, você poderia usar o mesmo raciocínio para realizar o controle de ações dentro do formulário usando ActionList. A estrutura seria mais ou menos essa:
-Listar formulários (itens do menu principal)
--Para cada formulário, listar as Actions.
O usuário teria então a possibilidade de definir a permissão de acesso a um item do menu principal, ou às ações de cada formulário.
Ao abrir cada form, você precisaria verificar se o usuário tem acesso a cada Action.
Bom, é apenas uma ideia.
Boa sorte.
Bom Joel, de fato é uma idéia válida, vou fazer alguns testes e verificar se é de fato viável.
Obrigado por responder.
Eu tenho a tabela de usuário, a tabela de classes de acesso e a tabela de permissões.
Nessa tabela de permissões fica armazenado tudo que o usuário logado não pode fazer no sistema.
No onCreate do datamodule eu carrego todos os acessos do meu sistema, e em cada lugar no programa que eu preciso verificar a classe eu faço um select no banco verificando se a classe de acesso do usuário logado tem permissão pra fazer tal operação.
No login do sistema eu carrego a classe de acesso do usuário logado.
Fiz um exemplo do jeito que eu trabalho.
Quando incluir uma nova funcionalidade no software e essa precisar de controle de acessos é só ir na função CarregaAcessos do DataModule e inserir ali, depois é só ir na tela Permissões e marcar sim ou não para classe de acesso selecionada.
[url]www.cdnweb.com.br/projeto_acesso.rar[/url]
Me fala o que você acha.
Esqueci de mencionar que fiz o exemplo usando Delphi7 com Firebird 2.0. O BD está na mesma pasta do projeto, e para acesso ao sistema tem dois usuários cadastrados. SV que está sem senha e VENDEDOR com senha 1234.
Claudia, eu baixei o exemplo que você disponibilizou. De fato tive problema com o login, rs Mas instalei o IBExpert aqui e havia conseguido a senha. rs Mas o fato é que ao rodar o exemplo fiquei bastante impressionado com a forma como o mesmo funciona, parece realmente se adequar ao que preciso.
Como tenho que trabalhar só vou ter tempo de analisar os fontes no final do dia. Mas assim que o fizer posto aqui mais detalhes sobre a minha experiência com o mesmo. Fico imensamente agradecido com o seu esforço em ajudar. Muito obrigado realmete.
Att.
Arthur de Andrade
Gostei + 0
21/09/2012
Claudia Nogueira
Gostei + 0
21/09/2012
Alisson Santos
Controles você pode criar de diversas formas e tipos, depende muito da necessidade que tem.
Por exemplo aqui na empresa que eu trabalho tivemos que desenvolver uma rotina de aprovação de vendas de clientes bloqueados que não encontramos nada na internet e montamos a rotina e desenvolvemos esse bloqueio.
Sempre que for trabalhar com o tipo de bloqueio mencionado, tem que ter uma tabela que irá gravar o que os usuários podem e não podem.
No caso do actionlist ou o actionmanager se criar o controle do botão a ele também poderá ser utilizado, pois ele é uma ótima ferramenta.
Só uma dica, pense sempre em utilizar recursos que o banco dispões.
Gostei + 0
22/09/2012
Thebluemonkey
Claudia,
Estou sim tendo algumas dificuldades em alguns pontos, deixe-me explicar um pouco delas, e principalmente, ver se entendi corretamente a metodologia utilizada. Acredito que até mesmo por ter um nível bastante iniciante no que diz respeito as metodologias de desenvolvimento em Delphi. Outra questão que me impediu um pouco foi o fato de eu não trabalhar com DBExpress, mas sim com SDAC e MSSQLServer. As dúvidas são as seguintes.
# Toda vez que é realizado o processo de inicialização do sistema a função CarregaAcessos, que possui ali na sua implementação os acessos do sistema, chama a função InsereAcessos passando estes acessos certo? Mas se esta função foi chamada na última execução do sistema como não ter conflitos "reinserindo" estes dados no banco?
# Percebi que o ClientDataSet CdsAcessos possui os campos "Classe, Descricao e Ordem", mas no entanto não está vinculado a nenhum objeto na sua propriedade CommandText. Estes campos são campos virtuais? Só ficarão disponíveis para consulta em runtime?
# Verifiquei que o CdsAcessos também possui os campos "Classe, Descricao, Ordem" e um adicional "TemPermissao". Estes campos também são campos virtuais certo? Estou tendo um pouco de dificuldade para compreender a relação entre os objetos da tabela SEM_PERMISSAO com os objetos tratados no sistema.
Fico sem jeito de expôr estas questões uma vez que você já me fez a enorme gentileza de me passar este exemplo. Até demorei para responder aqui porque estava aqui apanhando um pouquinho dele. rsrsrs Até insisto nele porque achei uma forma bastante inteligente de controlar os acessos no sistema.
Mas se você puder abordar estes aspectos que mencionei seria muito bom mesmo. De qualquer forma já estou muito agradecido.
Att.
Arthur de Andrade
Gostei + 0
22/09/2012
Thebluemonkey
Controles você pode criar de diversas formas e tipos, depende muito da necessidade que tem.
Por exemplo aqui na empresa que eu trabalho tivemos que desenvolver uma rotina de aprovação de vendas de clientes bloqueados que não encontramos nada na internet e montamos a rotina e desenvolvemos esse bloqueio.
Sempre que for trabalhar com o tipo de bloqueio mencionado, tem que ter uma tabela que irá gravar o que os usuários podem e não podem.
No caso do actionlist ou o actionmanager se criar o controle do botão a ele também poderá ser utilizado, pois ele é uma ótima ferramenta.
Só uma dica, pense sempre em utilizar recursos que o banco dispões.
Alisson, Obrigado por responder.
Na empresa ondem trabalho o sistema também possui rotinas bastante complexas de controle de usuários, com diversos tipos de bloqueios e estas rotinas de liberação de senha. O problema é que, além de eu desejar (com a ajuda de vocês) elaborar um processo que eu possa entender plenamente, eu também desejo algo em bastante menor escala.
Até cogitei a possibilidade de vincular actions a todos os botões de um formulário, mas imaginei que poderia ser impráticável implementar isso em um módulo de vendas por exemplo, onde existem inúmeros menus e "subformulários" com mais opçõoes. Outra coisa que me desanimou no que diz respeito ao uso das actions foi o fato de nao permitir a verificação de uma permissão no meio de uma rotina, para poder dar um exit ou abort.
Att.
Arthur de Andrade
Gostei + 0
26/09/2012
Luiz Ferreira
você pode me mandar um exemplo desse seu código>>> luizcarloscf@hotmail.com
Gostei + 0
26/09/2012
Claudia Nogueira
Claudia,
Estou sim tendo algumas dificuldades em alguns pontos, deixe-me explicar um pouco delas, e principalmente, ver se entendi corretamente a metodologia utilizada. Acredito que até mesmo por ter um nível bastante iniciante no que diz respeito as metodologias de desenvolvimento em Delphi. Outra questão que me impediu um pouco foi o fato de eu não trabalhar com DBExpress, mas sim com SDAC e MSSQLServer. As dúvidas são as seguintes.
# Toda vez que é realizado o processo de inicialização do sistema a função CarregaAcessos, que possui ali na sua implementação os acessos do sistema, chama a função InsereAcessos passando estes acessos certo? Mas se esta função foi chamada na última execução do sistema como não ter conflitos "reinserindo" estes dados no banco?
# Percebi que o ClientDataSet CdsAcessos possui os campos "Classe, Descricao e Ordem", mas no entanto não está vinculado a nenhum objeto na sua propriedade CommandText. Estes campos são campos virtuais? Só ficarão disponíveis para consulta em runtime?
# Verifiquei que o CdsAcessos também possui os campos "Classe, Descricao, Ordem" e um adicional "TemPermissao". Estes campos também são campos virtuais certo? Estou tendo um pouco de dificuldade para compreender a relação entre os objetos da tabela SEM_PERMISSAO com os objetos tratados no sistema.
Fico sem jeito de expôr estas questões uma vez que você já me fez a enorme gentileza de me passar este exemplo. Até demorei para responder aqui porque estava aqui apanhando um pouquinho dele. rsrsrs Até insisto nele porque achei uma forma bastante inteligente de controlar os acessos no sistema.
Mas se você puder abordar estes aspectos que mencionei seria muito bom mesmo. De qualquer forma já estou muito agradecido.
Att.
Arthur de Andrade
1 - # Toda vez que é realizado o processo de inicialização do sistema a função CarregaAcessos, que possui ali na sua implementação os acessos do sistema, chama a função InsereAcessos passando estes acessos certo? Mas se esta função foi chamada na última execução do sistema como não ter conflitos "reinserindo" estes dados no banco?
R: eu utilizo a função CarregaAcessos pra preencher um ClientDataSet como tabela temporária. Isso não envolve o banco de dados, pois eu não cadastro tudo que o sistema tem em tabela no BD. Somente deixo direto no software todas as possibilidades. No BD fica só uma tabela das coisas que o usuário não pode fazer. Quando por exemplo você desenvolver uma nova tela ou relatório, ou qualquer outra coisa, e essa coisa tenha que verificar se o usuário logado pode usar, vai fazer um SELECT na tabela SEM_PERMISSAO (função Permissao). Se retornar algum valor, quer dizer que o usuário logado não pode fazer tal coisa.
2 - # Percebi que o ClientDataSet CdsAcessos possui os campos "Classe, Descricao e Ordem", mas no entanto não está vinculado a nenhum objeto na sua propriedade CommandText. Estes campos são campos virtuais? Só ficarão disponíveis para consulta em runtime?
R: o CdsAcessos não está ligado a nenhuma tabela. É uma "tabela temporária", por isso não está ligada a nada.
3 - # Verifiquei que o CdsAcessos também possui os campos "Classe, Descricao, Ordem" e um adicional "TemPermissao". Estes campos também são campos virtuais certo? Estou tendo um pouco de dificuldade para compreender a relação entre os objetos da tabela SEM_PERMISSAO com os objetos tratados no sistema.
R:
Tabela USUARIO (Exemplo: o usuário SV que está ligado a classe de acesso 1)
Tabela CLASSE_ACESSO (Exemplo: a classe de acesso 1 dei o nome de SUPERVISOR)
Tabela SEM_PERMISSAO (Exemplo: os usuários da classe de acesso 1 não podem fazer venda, então tem um registro nessa tabela. ID_CLASSE_ACESSO = 1 e TELA = VENDA ). Esse nome venda eu inventei. Então no botão de venda eu coloquei a verificação:
if C_acessoDM.Permissao('VENDA', iClasseAcessoUsuario) then
Application.MessageBox('Tem permissão','Informação',MB_ICONINFORMATION+MB_OK)
else
Application.MessageBox('Não tem permissão','Informação',MB_ICONINFORMATION+MB_OK);
O CdsAcessos é um temporário que eu crio somente pra poder manipular em algum lugar do sistema, como na tela AcessosForm. Nessa tela eu marco o que cada classe pode ou não fazer, e somente no botão gravar é que grava de fato na tabela PERMISSAO. Faz uma passagem no CdsAcessos e tudo que estiver como Não, insere na tabela.
Eu acho melhor trabalhar dessa maneira, em vez de ter duas tabelas, uma com as funcionalidades do sistema e outra com o que o usuário pode ou não pode fazer.
Gostei + 0
26/09/2012
Claudia Nogueira
você pode me mandar um exemplo desse seu código>>> luizcarloscf@hotmail.com
[url]http://www.cdnweb.com.br/projeto_acesso.rar[/url]
Gostei + 0
27/09/2012
Alisson Santos
Bom esses tipos de controle são muitos pessoais então dificil falar qual o melhor ou o pior.
Existem muitas rotinas que podem ser utilizados como é no caso da empresa que eu trabalho.
A utilização de um action é mais facil pois pode varrer todos antes de abrir uma tela e verificar o status para o usuário.
Mais lembrando que exitem diversas formas, se quiser posso montar algo simples desse tipo de controle e mandar para você ver se te auxilia.
Gostei + 0
29/09/2012
Thebluemonkey
Alisson, é verdade, como você disse cada metodologia pode se aplicar a uma situação, ficando difícil mesmo falar qual melhor. rs Mas apesar de eu estar analisando o exemplo passado pela Claudia, eu gostaria muito sim de que, se estiver dentro das suas possibilidades do seu cronograma, você puder me enviar um exemplo com a sua sugestão de metodologia.
Afinal além de poder analisar os prós mais evidentes de cada um seria uma bela oportunidade para expandir meu conhecimento acerca do assunto, que se faz bastante necessário por sinal.
Meu email é andradedearthur@gmail.com.
Desde já agradeço a vocês pela boa vontade apresentada.
Att.
Arthur de Andrade
Gostei + 0
29/09/2012
Alisson Santos
Gostei + 0
26/12/2012
Nícolas Braz
Esse seu exemplo pode ser implementado para um controle de acessos por MainMenu?
Gostei + 0
12/05/2013
Frederico Brigatte***
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)