Array
(
)

Como Gerenciar acessos ao sistema

Fernando Borstmann
   - 02 mai 2012

Galera, mais uma dúvida aqui de desenvolvedor iniciante rss, estou desenvolvendo um sistema que terá diversos acessos por vários usuários, eu gostaria de criar uma política de acesso por login tipo: usuário perfil A tem acesso a cadastros, perfil B tem acesso a movimentações e assim por diante, ja pesquisei um bocado mas não achei nenhum exemplo mais claro de como gerenciar o sistema, se alguém tiver um exemplo não muito complicado e puder me dar um help agradeço!
abs.

Edson Melo
   - 04 mai 2012

ola meu caro amigo

resolvi este problema de um modo facil e rapido

na ficha do usuario criei um campo com 50 caracteres, ou seja 50 vezes a letra S, onde cada um corresponde a um item do menu, tenho uma funcão que troca o S por N, e quando o usuario vai acessar a opção ele verifica se naquela posicao tem um S para sim pode acessar ou um N para não pode acessar, para tal controle uso a funcao copy(string, posicao, 1) para verificar se ele pode e outra para trocar, a letra daquela posicao. simples mesmo, a unica coisa que teria que pesquisar e esta funcao que troca a letra, tenho mas esta no meu computador em casa e não esta aqui comigo agora

qualquer coisa ou duvida estou a disposicao

edson garcia de melo

Fernando Borstmann
   - 07 mai 2012

Edson, obrigado pela resposta,

mas não entendi muito bem, voce tem um campo no banco com 50 posições e verifica pra cada form que o usuário abre uma posição desse campo? tem como postar o codigo para eu tentar entender? agradeco

Rodrigo Odasaki
   - 07 mai 2012

Olá Fernando,

Você não especificou bem qual seria a plataforma: MVC, Windows Forms, Web Forms..
Mas indo direto ao tratamento no banco, veja como eu faria:

Você disse que precisa especificar permissões para determinados usuários, onde cada
usuário faria parte de um perfil.

Neste meu explo eu criei 4 tabelas sendo: Usuario, UsuarioPerfil, PerfilPermissao e Permissao, conforme o exemplo abaixo:

#Código

<img src=http://1.bp.blogspot.com/-GWB-2S2-M88/T6eIQzLfNuI/AAAAAAAAAGY/MSp22m5jrvE/s1600/devpermissao.png>

Rodrigo Odasaki
   - 07 mai 2012

http://1.bp.blogspot.com/-GWB-2S2-M88/T6eIQzLfNuI/AAAAAAAAAGY/MSp22m5jrvE/s1600/devpermissao.png

Rodrigo Odasaki
   - 07 mai 2012

Continuando,

A tabela Usuario armazena os usarios do sistema.
Imagem: http://2.bp.blogspot.com/-rM7mYznI1vA/T6eISdfUgxI/AAAAAAAAAG4/YXxntt12RoU/s1600/devpermissao_usuarios.png

A tabela UsuarioPerfil armazena os perfils do sistema.
Imagem: http://3.bp.blogspot.com/-jZys5KyFbpw/T6eIRRR6I6I/AAAAAAAAAGg/_jwPkibkM40/s1600/devpermissao_perfil.png

A tabela Permissao armazena as ações a quais cada perfil poderá ter.
Imagem: http://2.bp.blogspot.com/-eAbuPMZHtU4/T6eISEj-mgI/AAAAAAAAAGw/DWL5eH93KIg/s1600/devpermissao_permissao.png

A tabela PerfilPermissao é uma tabela auxiliar, onde 1 perfil pode ter N permissões.
Imagem: http://1.bp.blogspot.com/-sVnspxtzSwY/T6eIRkVoHyI/AAAAAAAAAGo/iq7DP0JVbcE/s1600/devpermissao_perfilpermissao.png

Seguem um JOIN feito entre Usuario X UsuarioPerfil:
Imagem: http://3.bp.blogspot.com/-X4dUDp2LARM/T6eIQR9ICYI/AAAAAAAAAGQ/XsgetctkPZI/s1600/UsuarioXPerfil.png

E um Join jeito entre a tabela PerfilPermissao e Permissao:
http://4.bp.blogspot.com/-s-7tMitTDwk/T6eIP0jdmNI/AAAAAAAAAGI/O3CS1VyvOpI/s1600/PermissaoXPerfilPermissao.png

Veja, que nesta última imagem,
o usuário com perfil Usuário só pode visualizar.
o usuário com perfil Moderador pode Visualizar e Alterar.
o usuário com perfil Administrador pode Visualizar, Alterar, Incluir e Excluir.

Então na sua aplicação, você obtém qual o usuário e aplica a validação de permissão em página ou ação.

Este meu exemplo é teórico em uma aplicação web forms, mas eu acredito que você possa aplicar o mesmo conceito em windows forms..

Aplicando permissão na página:

Página Admin.aspx
Você deseja apenas que usuários com perfil de admin acessem esta página:

if Usuario.Perfil != Administrador
Aqui você faz sua ação: Você pode dar uma execption ou redirecionar ele para outra página.
else
CarregaPagina

Mais uma vez, o exemplo acima foi apenas teórico, você pode aplicar o mesmo conceito em ações dentro de uma página, ou seja, todos os usuários com qualquer perfil pode acessar a página, mas de acordo com o perfil você libera o acesso de uma determinado controle.

Abraços.

Rodrigo Odasaki
   - 07 mai 2012

Você também pode utilizar uma API chamada membership, eu já usei ela para aplicações WEB. Não sei se funciona em web forms.
Você pode pesquisar, mas resumindo, dentro do diretório de instalação do seu Framework na 2.0, existe um arquivo chamado: aspnet_regsql

O diretório dele fica em: C:\Windows\Microsoft.NET\Framework\v2.0.50727

Este arquivo é um assistente a qual você poderá explicar sua base, ele apenas executa um script criando algumas tabelas no seu banco, já possui diversas tabelas de usuários, roles e etc e você pode facilmente integrar com os controles do VS, pelo menos em web forms.

Da uma pesquisada, eu já respondi algo sobre Membership neste tópico:
http://www.devmedia.com.br/forum/memberchip/395462

Abraços

Rodrigo Odasaki
   - 07 mai 2012

Retificando:
Onde eu disse: Não sei se funciona em web forms.
Correto: Não sei se funciona em windows forms.

Fernando Borstmann
   - 07 mai 2012

puxa valeu pelas respostas, eu estou usando windows forms, mas minha duvida é: após criar todas essas permissões e tal como eu faço para ler todas elas no login do usuário? tipo eu criei as permissões e perfis, mas na hora que o usuário fizer login eu tenho que ver qual o perfil dele e habilitar e desabilitar botoes para que ele n tenha acesso a certas telas do sistema, não sei se fui claro :)

Rodrigo Odasaki
   - 08 mai 2012

Olá Fernando,

Eu não trabalho com windows forms, mas acredito que seja mais ou menos assim.

Este exemplo é bem simples, eu fiz com ADO.NET, mas preferia fazer com LINQ TO SQL ou entity, já que desta forma ele me traz tudo em objeto.

Neste meu exemplo, eu criei uma classe chamada Usuario, nela eu criei minhas propriedades, enumeradores e métodos para validar e autenticar.

Basicamente, você pode controlar a permissão assim:

- Negando o acesso ao form
- Ocultando controles

Como você disse, seu usuário está relacionado em 1 perfil e cada perfil possui diferentes permissões.

Imagem tela de login do Form1:
http://1.bp.blogspot.com/-LxwgSrtfJLQ/T6kQIsk8XqI/AAAAAAAAAHs/RetoOVvY_xQ/s1600/printForm1.png

Imagem codigo login do Form1:
http://4.bp.blogspot.com/-NK_cS_xkdy0/T6kQGvzp9FI/AAAAAAAAAHU/YbJFpfnZCR8/s1600/codForm1.png

Imagem classe Usuario:
http://3.bp.blogspot.com/-4ZAZu9-wmRA/T6kQF2nvyfI/AAAAAAAAAHM/MxF1fztOPUo/s1600/classeUsuario.png

Imagem método Autenticar:
http://2.bp.blogspot.com/--8rNP2NJ0hk/T6kQFasDCBI/AAAAAAAAAHE/GLrRHp9-be0/s1600/classeUsuario-Autenticar.png

Basicamente, o que eu faço é:

1º Validar o login e senha
2º Consultar no método Autenticar, se o usuário e a senha existe
3º Se ele existe, ele já retorna um objeto do Usuario preenchido
4º Depois eu redireciono para o Form Home passando o objeto

5º No form Home, eu coloquei 2 exemplos, onde somente usuários com perfis de administradores, podem visualizar um Panel com controles conforme a imagem abaixo:

Imagem: Ocultando controles
http://1.bp.blogspot.com/-s9xb1mmaYWg/T6kQIOcMcrI/AAAAAAAAAHk/To5IUsZ408s/s1600/permissaoPorHide.png

6º Também existe outro exemplo, onde eu posso negar o acesso ao form, mostrando uma mensagem:

Imagem: Negando acesso:
http://1.bp.blogspot.com/-I-J1cCjVkpw/T6kQHX89k6I/AAAAAAAAAHc/XIXNTfU9jmA/s1600/permissaoPorAviso.png

Estes exemplos são bem simples, agora utilizando aquela tabela auxiliar chamada PerfilPermissoes, você simplesmente consulta direto no banco se o perfil possui as permissões e vai realizando a validação por ação de acordo com o perfil.

Rodrigo Odasaki
   - 09 mai 2012

Fernando,

No exemplo acima, eu montei a permissão em referência ao perfil do usuário.

Exemplo, se ele for do perfil Administrador: Conceda o acesso, se for Usuário: Negue o acesso.

Montei um exemplo agora, que ele concede o acesso de acordo com as permissões do Perfil utilizando aquela tabela Auxiliar chamada PerfilPermissao.

1º Criei uma classe chamada Permissao que possui propriedades, enumeradores e um método que é responsável em verificar se o perfil possui permissão:
http://4.bp.blogspot.com/-kycbe3Lo_RQ/T6oS0G-qoDI/AAAAAAAAAIo/jPb5cgTat94/s1600/classePermissao.png

2º Temos um botão chamado Adicionar Usuário:
http://rodrigoodasaki.blogspot.com.br/2012/05/teste.html

3º No método do botão eu fiz uma validação antes de chamar o Form AdicionarUsuario, utilizando o método VerificaPermissao.
http://1.bp.blogspot.com/-_QNOQiEkNA4/T6oSyfZpnJI/AAAAAAAAAII/OsUKFLn-Ph0/s1600/AcessoPorPermissaoMetodo.png

4º No método VerificaPermissao, ele recebe como parâmetro o o IdPerfil do usuário e o IdPermissao da permissão desejada. Nota-se que eu estou utilizando um enum para ficar mais fácil o entendimento. Basicamente neste método eu estou utilizando o ExecuteScalar() onde ele retorna apenas um registro, então eu faço um if para saber se ele obteve algum registro ou não. Se sim, ele retorna true a qual é liberado o Form. Como disse, você pode ocultar as ações ou retornar mensagens negando o acesso.
http://2.bp.blogspot.com/-uum6Q4GCvKI/T6oSzwCXJFI/AAAAAAAAAIg/O35McKX9SNs/s1600/VerificaPermissao.png

Veja: Estou acessando com o usuário joao.alves a qual faz parte do perfil Usuario, onde não possui permissão do tipo Incluir:
http://2.bp.blogspot.com/-KXYZH42j8NY/T6oSzQwC-OI/AAAAAAAAAIY/4YLA-yw1rcI/s1600/SemPermissao.png

Já acessando com o usuário carlos.henrique a qual faz parte do perfil Administrador, onde possui permissão do tipo Incluir:
http://3.bp.blogspot.com/-lvGjoq_LtuY/T6oSy65_xsI/AAAAAAAAAIQ/djhrPoX-bUM/s1600/PossuiPermissao.png

Novamente, segue as entidades:
http://1.bp.blogspot.com/-GWB-2S2-M88/T6eIQzLfNuI/AAAAAAAAAGY/MSp22m5jrvE/s1600/devpermissao.png

E a tabela auxiliar PerfilPermissao:
http://1.bp.blogspot.com/-sVnspxtzSwY/T6eIRkVoHyI/AAAAAAAAAGo/iq7DP0JVbcE/s1600/devpermissao_perfilpermissao.png

Veja que o primeiro registro possui o IdPerfil = 1 e IdPermissao = 1, ou seja o perfil do tipo Usuario só possui permissão Visualizar. Desta forma, você pode incluir N permissões para qualquer Perfil, e o método VerificaPermissao fica responsável por tratar as permissões e liberar o acesso na aplicação.

Não sei se esta é a forma correta, eu sou programador web forms e asp.net mvc, onde já é um pouco diferente. Também não estou seguindo boas práticas e nem trabalhando com criptografia e ncamadas, já que o foco é entender como aplicar permissões de acordo com o perfil do usuário.

Abraçoss

Rodrigo Odasaki
   - 09 mai 2012

Corrigindo:

Onde está:
2º Temos um botão chamado Adicionar Usuário:
http://rodrigoodasaki.blogspot.com.br/2012/05/teste.html

Certo:
http://4.bp.blogspot.com/-9KgTXNDQ_Dk/T6oSxwxCnwI/AAAAAAAAAIA/JvYKzXHG_rA/s1600/AcessoPorPermissao.png

Fernando Borstmann
   - 09 mai 2012

Rodrigo,

Agradeço toda sua atenção, vou montar o projeto com base nas suas orientações e ver como se comporta.

abraço

Rodrigo Odasaki
   - 09 mai 2012

Beleza Fernando,

Enviei o projeto e o banco para seu e-mail, tenho certeza que será de grande utilidade.

Como estou utilizando SQL Server, você precisa pegar os 2 arquivos com extensão .mdf e .log e jogar dentro da pasta Data do seu SQL Server e depois pelo SQL Server Management Studio, você precisa dar um Attach no base.

Caso o projeto não execute, clique com o botão direito no projeto, acesse as propriedades e em Propriedades na guia Signing, desmarque a opção Sign the ClickOnce manifests.

Abraços

Denilosn Carlos
   - 13 dez 2014

você poderia mandar para meu e-mail tbm estou com dificuldades nisso

obrigado