Limitar usuários

Delphi

22/06/2011

Estou querendo fazer um sistema de login com perfil de usuário, ou seja, o usuário fulano pode acessar o menu x, y e z. O usuário beltrano tem acesso aos menus a, x e z; O usuário admim tem acesso a todos os menus.

É isso.
Frederico Brigatte***

Frederico Brigatte***

Curtidas 0

Respostas

Eliel Martins

Eliel Martins

22/06/2011

  Olá Frederico !


  Não entendi, você está afirmando se é dessa forma que tem que fazer ?, caso seja isso que queira saber, o controle de usuário é sim feito dessa forma, agora um dica que deixo para você é que existe um componente muito bom chama UserControl, que faz tudo isso, tem criptografia de senha utilizando MD5, execelente componente é alem do mais ele é free.

  Espero ter ajudado, se não te ajudei, por favor detalhe mais o que deseja.


  Eliel G. Martins
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

22/06/2011

  Olá Frederico !


  Não entendi, você está afirmando se é dessa forma que tem que fazer ?, caso seja isso que queira saber, o controle de usuário é sim feito dessa forma, agora um dica que deixo para você é que existe um componente muito bom chama UserControl, que faz tudo isso, tem criptografia de senha utilizando MD5, execelente componente é alem do mais ele é free.

  Espero ter ajudado, se não te ajudei, por favor detalhe mais o que deseja.


  Eliel G. Martins


É como se fosse usar o UserControl, só que com componentes nativos do delphi mesmo. Estou com dificuldade em utilizar o UserControl.
GOSTEI 0
Eliel Martins

Eliel Martins

22/06/2011

  Olá Frederico !


  Se você interessar eu tenho algumas video aulas de como utilizar o UserControl, ele não é complicado não, se quiser mando no seu e-mail, só me passar seu e-mail que te envio hoje a noite. Também existe um controle de usuário da TMS que parece ser muito bom.


  Eliel G. Martins
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

22/06/2011

  Olá Frederico !


  Se você interessar eu tenho algumas video aulas de como utilizar o UserControl, ele não é complicado não, se quiser mando no seu e-mail, só me passar seu e-mail que te envio hoje a noite. Também existe um controle de usuário da TMS que parece ser muito bom.


  Eliel G. Martins


Ok, meu email é: frederico.brigatte@itelefonica.com.br

Qual é esse da TMS, é free, onde baixar? Tem exemplo?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

22/06/2011

  Olá Frederico !


  Se você interessar eu tenho algumas video aulas de como utilizar o UserControl, ele não é complicado não, se quiser mando no seu e-mail, só me passar seu e-mail que te envio hoje a noite. Também existe um controle de usuário da TMS que parece ser muito bom.


  Eliel G. Martins


Ok, meu email é: frederico.brigatte@itelefonica.com.br

Qual é esse da TMS, é free, onde baixar? Tem exemplo?


Bom dia Eliel, vc não enviou pra mim.
GOSTEI 0
Anderson Nunes

Anderson Nunes

22/06/2011

Olha, me ocorreu derepente uma forma aqui, você teria que testar para ver se funcionaria e se ficaria viavel. Bom, voce criaria uma tabela de usuarios e uma tabela filha par acada usuario, esta tabela teria basicamente o campo para identificar o usuario e o campo para o nome do formulario, ainda com o form de cadstro de usuario voce vai clicando sobre os menus e abrindo os forms que o usuario não poderá acessar, e ao abrir o form ira salvar seu nome na tabela filha do usuario, poderá fazer para todos os forms ou ações, dando bastante maleabilidade. Nos eventos de abertura dos forms, voce faz uma busca pelo nome do form na tabela e se não houver nada ele abre e se houver ele apresenta uma mensagem de bloqueio. Sei lá, derepente seja inviavel mas voce pode pensar e adaptar esta ideia para sua necessidade..valeu.. 
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

22/06/2011

Olha, me ocorreu derepente uma forma aqui, você teria que testar para ver se funcionaria e se ficaria viavel. Bom, voce criaria uma tabela de usuarios e uma tabela filha par acada usuario, esta tabela teria basicamente o campo para identificar o usuario e o campo para o nome do formulario, ainda com o form de cadstro de usuario voce vai clicando sobre os menus e abrindo os forms que o usuario não poderá acessar, e ao abrir o form ira salvar seu nome na tabela filha do usuario, poderá fazer para todos os forms ou ações, dando bastante maleabilidade. Nos eventos de abertura dos forms, voce faz uma busca pelo nome do form na tabela e se não houver nada ele abre e se houver ele apresenta uma mensagem de bloqueio. Sei lá, derepente seja inviavel mas voce pode pensar e adaptar esta ideia para sua necessidade..valeu.. 


Teria como fazer um exemplo, nunca fiz isso. Estou com dificuldades. E empacado nisso.
GOSTEI 0
Anderson Nunes

Anderson Nunes

22/06/2011

Ta eu vou fazer um exemplo com clientdataset, voce ajusta para sua necessidade..


GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

22/06/2011

Ta eu vou fazer um exemplo com clientdataset, voce ajusta para sua necessidade..




Quer meu email? Agradeço por enquanto.

frederico.brigatte@itelefonica.com.br
GOSTEI 0
Adalton Goncalves

Adalton Goncalves

22/06/2011

Um jeito simples de você fazer, é nos menus utilizar o propriedade "tag"...definindo assim, pode definir a que menus cada usuario pode ter acesso. Agora estou fora da minha máquina, mas amanhã lhe posto um exemplo prático, agora com componente externo tem esse exemplo do site parceiro:

http://www.linhadecodigo.com.br/artigo/822/Delphi-Controle-de-AcessoTreeView-para-gerenciamento-de-usu%C3%A1rios.aspx
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

22/06/2011

Um jeito simples de você fazer, é nos menus utilizar o propriedade "tag"...definindo assim, pode definir a que menus cada usuario pode ter acesso. Agora estou fora da minha máquina, mas amanhã lhe posto um exemplo prático, agora com componente externo tem esse exemplo do site parceiro:

http://www.linhadecodigo.com.br/artigo/822/Delphi-Controle-de-AcessoTreeView-para-gerenciamento-de-usu%C3%A1rios.aspx


Ok, aguardo. Obrigado por hora, ok. Muito obrigado.
GOSTEI 0
Adalton Goncalves

Adalton Goncalves

22/06/2011

Bom vamos lá, vou tentar dar um exemplo simples para explicar isso:
Vamos supor que seu sistema tenha 3 níveis de acesso.

Nivel 1 - Mínimo (funções básicas. Ex: Apenas Consulta)
Nivel 2 - Intermediário(todas do N1, mais algumas. Ex: Inclusão)
Nivel 3 - Total (Todas acima, mais inclusão e alteração)

Na propriedade tag do menu(ou o que estiver controlando(forms, botões, etc) você define qual o nível necessário para acessar essa função. No cadastramento do usuario (na tabela) você teria a indicação sobre qual nível de acesso esse usuário tem, baseando nos níveis cadastrados no sistema, ou seja 1 menor acesso à 3 nível administrador.

A implementação pode ser feita de várias formas, no caso de controle no Menu(depende muito da sua necessidade), a cada clique no menu poderia fazer a verificação:

procedure TForm1.MnuCadastroClick(Sender :TObject);
begin
  if Nivel_Usuario < (Sender as TMenuItem).Tag then
  begin
    ShowMessage('Você não possui autorização para acessar esta função!');
    Exit;  // Encerra execução do procedimento
  end
 // segue com o código normalmente
  ...
end;


Mas também, você poderia, "após validar o usuário", verificar todos os seus itens de menu e ocultá-los caso o nível de acesso do usuário fosse inferior ao valor da tag dos mesmos e, neste caso, não seria necessário fazer as validações.

Exemplo:
// Procedimento para "mapear" todos os itens do menu
procedure SetMenuAccess(Menu :TMenuItem; AccessLevel :Integer);
var
  Idx :Integer;
begin
  for Idx := 0 to Menu.Count -1 do
  begin
   // habilita ou não item conforme nível de acesso configurado
    Menu.Items[Idx].Enabled := Menu.Items[Idx].Tag <= AccessLevel;
   // apenas se habilitado é que processa os sub-menus
    if Menu.Items[Idx].Enabled then
      SetMenuAccess(Menu.Items[Idx], AccessLevel);
  end;
end;


ou entao caso os bloqueios sejam internos (exemplo: o usuario pode abrir o form, mas alguns botoes depende dos privilégios) faça o mesmo procedimento acima de varredura, mas defina no evento onCreate do form, para que ao criar o form ele já defina o que vai estar visible (ou enabled).


Espero ter ajudado.
Qualquer duvida, estou a disposição.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

22/06/2011

Bom vamos lá, vou tentar dar um exemplo simples para explicar isso:
Vamos supor que seu sistema tenha 3 níveis de acesso.

Nivel 1 - Mínimo (funções básicas. Ex: Apenas Consulta)
Nivel 2 - Intermediário(todas do N1, mais algumas. Ex: Inclusão)
Nivel 3 - Total (Todas acima, mais inclusão e alteração)

Na propriedade tag do menu(ou o que estiver controlando(forms, botões, etc) você define qual o nível necessário para acessar essa função. No cadastramento do usuario (na tabela) você teria a indicação sobre qual nível de acesso esse usuário tem, baseando nos níveis cadastrados no sistema, ou seja 1 menor acesso à 3 nível administrador.

A implementação pode ser feita de várias formas, no caso de controle no Menu(depende muito da sua necessidade), a cada clique no menu poderia fazer a verificação:

procedure TForm1.MnuCadastroClick(Sender :TObject);
begin
  if Nivel_Usuario < (Sender as TMenuItem).Tag then
  begin
    ShowMessage('Você não possui autorização para acessar esta função!');
    Exit;  // Encerra execução do procedimento
  end
 // segue com o código normalmente
  ...
end;


Mas também, você poderia, "após validar o usuário", verificar todos os seus itens de menu e ocultá-los caso o nível de acesso do usuário fosse inferior ao valor da tag dos mesmos e, neste caso, não seria necessário fazer as validações.

Exemplo:
// Procedimento para "mapear" todos os itens do menu
procedure SetMenuAccess(Menu :TMenuItem; AccessLevel :Integer);
var
  Idx :Integer;
begin
  for Idx := 0 to Menu.Count -1 do
  begin
   // habilita ou não item conforme nível de acesso configurado
    Menu.Items[Idx].Enabled := Menu.Items[Idx].Tag <= AccessLevel;
   // apenas se habilitado é que processa os sub-menus
    if Menu.Items[Idx].Enabled then
      SetMenuAccess(Menu.Items[Idx], AccessLevel);
  end;
end;


ou entao caso os bloqueios sejam internos (exemplo: o usuario pode abrir o form, mas alguns botoes depende dos privilégios) faça o mesmo procedimento acima de varredura, mas defina no evento onCreate do form, para que ao criar o form ele já defina o que vai estar visible (ou enabled).


Espero ter ajudado.
Qualquer duvida, estou a disposição.


Para os níveis de acesso, preciso criar uma tabela? Teria como montar um exemplo para que possa adaptar?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

22/06/2011

Bom vamos lá, vou tentar dar um exemplo simples para explicar isso:
Vamos supor que seu sistema tenha 3 níveis de acesso.

Nivel 1 - Mínimo (funções básicas. Ex: Apenas Consulta)
Nivel 2 - Intermediário(todas do N1, mais algumas. Ex: Inclusão)
Nivel 3 - Total (Todas acima, mais inclusão e alteração)

Na propriedade tag do menu(ou o que estiver controlando(forms, botões, etc) você define qual o nível necessário para acessar essa função. No cadastramento do usuario (na tabela) você teria a indicação sobre qual nível de acesso esse usuário tem, baseando nos níveis cadastrados no sistema, ou seja 1 menor acesso à 3 nível administrador.

A implementação pode ser feita de várias formas, no caso de controle no Menu(depende muito da sua necessidade), a cada clique no menu poderia fazer a verificação:

procedure TForm1.MnuCadastroClick(Sender :TObject);
begin
  if Nivel_Usuario < (Sender as TMenuItem).Tag then
  begin
    ShowMessage('Você não possui autorização para acessar esta função!');
    Exit;  // Encerra execução do procedimento
  end
 // segue com o código normalmente
  ...
end;


Mas também, você poderia, "após validar o usuário", verificar todos os seus itens de menu e ocultá-los caso o nível de acesso do usuário fosse inferior ao valor da tag dos mesmos e, neste caso, não seria necessário fazer as validações.

Exemplo:
// Procedimento para "mapear" todos os itens do menu
procedure SetMenuAccess(Menu :TMenuItem; AccessLevel :Integer);
var
  Idx :Integer;
begin
  for Idx := 0 to Menu.Count -1 do
  begin
   // habilita ou não item conforme nível de acesso configurado
    Menu.Items[Idx].Enabled := Menu.Items[Idx].Tag <= AccessLevel;
   // apenas se habilitado é que processa os sub-menus
    if Menu.Items[Idx].Enabled then
      SetMenuAccess(Menu.Items[Idx], AccessLevel);
  end;
end;


ou entao caso os bloqueios sejam internos (exemplo: o usuario pode abrir o form, mas alguns botoes depende dos privilégios) faça o mesmo procedimento acima de varredura, mas defina no evento onCreate do form, para que ao criar o form ele já defina o que vai estar visible (ou enabled).


Espero ter ajudado.
Qualquer duvida, estou a disposição.


Para os níveis de acesso, preciso criar uma tabela? Teria como montar um exemplo para que possa adaptar?


Não entendi bem esse código, desculpe. Precisa montar uma tabela?
GOSTEI 0
Adalton Goncalves

Adalton Goncalves

22/06/2011


Para os níveis de acesso, preciso criar uma tabela? Teria como montar um exemplo para que possa adaptar?


Não entendi bem esse código, desculpe. Precisa montar uma tabela?


Ahh sim, perdão pela demora em responder, me enrolei num projeto aqui.
A quesão chave aqui, é o "controle de usuário", na tabela de usuário, voce deve definir um campo para este controle. Com o uso da tag dos componentes, um campo Nivel_Usuario sendo Integer já resolve o problemas aí sim, este campo recebe os valores de acesso.

Seguindo aquele exemplo:
Bom vamos lá, vou tentar dar um exemplo simples para explicar isso:
Vamos supor que seu sistema tenha 3 níveis de acesso.

Nivel 1 - Mínimo (funções básicas. Ex: Apenas Consulta)
Nivel 2 - Intermediário(todas do N1, mais algumas. Ex: Inclusão)
Nivel 3 - Total (Todas acima, mais inclusão e alteração)


Ou seja o admin vai receber no field da tabela user Nivel_User o valor 3, e assim por diante.

se caso o bloqueio de comando for ao clicar no menu, que nem o primeiro exemplo:

procedure TForm1.MnuCadastroClick(Sender :TObject);
begin
  if Nivel_Usuario < (Sender as TMenuItem).Tag then
  begin
    ShowMessage('Você não possui autorização para acessar esta função!');
    Exit;  // Encerra execução do procedimento
  end
 // segue com o código normalmente
  ...
end;



Este if está verificando o field Nivel_Usuario da tabela.

Já no segundo exemplo:

// Procedimento para "mapear" todos os itens do menu
procedure SetMenuAccess(Menu :TMenuItem; AccessLevel :Integer);
var
  Idx :Integer;
begin
  for Idx := 0 to Menu.Count -1 do
  begin
   // habilita ou não item conforme nível de acesso configurado
    Menu.Items[Idx].Enabled := Menu.Items[Idx].Tag <= AccessLevel;
   // apenas se habilitado é que processa os sub-menus
    if Menu.Items[Idx].Enabled then
      SetMenuAccess(Menu.Items[Idx], AccessLevel);
  end;
end;


Aqui está lendo todos os menus, para poder desabilitar aqueles em que o usuário não é autorizado a ver, para isso ele verifica novamente o field Nivel_Usuario da tabela e chama a procedure enviando o valor deste campo como AccessLevel.

Entao eis a questao, o sistema irá iniciar somente após o usuario colocar seu login e senha, que vai ser verificado na tabela, assim que foi autenticado, e antes de iniciar o form(entao esse procedimento deve estar no onCreate), ele irá verificar o Nivel_Usuario e chamar a procedure. Ou melhor ainda, pensando aqui, de maneira breve, ao invés de camar o procedimento, faz isso na procedure OnCreate mesmo, envia as info do user para uma variável global(isso deve ser feito de qualquer forma), e faz a verificação da variável com as tag.
GOSTEI 0
Adalton Goncalves

Adalton Goncalves

22/06/2011

Só simplificando algo que disse acima:

Este if está verificando o field Nivel_Usuario da tabela.


Quando disse isso quis dizer que o campo Nivel_User da tabela, já está carregado na variável global "Nivel_Usuario:Integer". Assim você já está verificando se o usuário pode ou não visualizar este formulário.

Se tiver ainda com dúvida, só avisar.

GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

22/06/2011

Só simplificando algo que disse acima:

Este if está verificando o field Nivel_Usuario da tabela.


Quando disse isso quis dizer que o campo Nivel_User da tabela, já está carregado na variável global "Nivel_Usuario:Integer". Assim você já está verificando se o usuário pode ou não visualizar este formulário.

Se tiver ainda com dúvida, só avisar.



Adalton, tem como postar um exemplo ou enviar para meu email: frederico.brigatte@itelefonica.com.br para que possa entender melhor, tá muito complicado isso, e o pior é que to precisando muito disso. Agradeço a atenção e não precisa se desculpar, eu é que peço desculpas por incomodar, é porque nunca fiz isso e entendo melhor com algo já pronto, ok, mas estou lendo o que vc posta, ai tento entender, tem como fazer um simples pra mim?
GOSTEI 0
Adalton Goncalves

Adalton Goncalves

22/06/2011

Pode deixar, esta noite, monto um arquivo e lhe mando, e depois posto o código aqui caso algué mais precise...
GOSTEI 0
Carlos Leonel

Carlos Leonel

22/06/2011

Eliel Martins, Há como me mandar por email video do usercontrol?   carlosalbertoleonel@gmail.com   Carlos
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

22/06/2011

Pode deixar, esta noite, monto um arquivo e lhe mando, e depois posto o código aqui caso algué mais precise...


Ok, obrigado pela ajuda. Está me ajudando bastante. Obrigado mesmo. Vou aguardar.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

22/06/2011

Pode deixar, esta noite, monto um arquivo e lhe mando, e depois posto o código aqui caso algué mais precise...


Ok, obrigado pela ajuda. Está me ajudando bastante. Obrigado mesmo. Vou aguardar.


Oi Adalton, não teve tempo de fazer ainda? Estou no aguardo, ok?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

22/06/2011

Pode deixar, esta noite, monto um arquivo e lhe mando, e depois posto o código aqui caso algué mais precise...


Ok, obrigado pela ajuda. Está me ajudando bastante. Obrigado mesmo. Vou aguardar.


Oi Adalton, não teve tempo de fazer ainda? Estou no aguardo, ok?


Oi Adalton, desculpa a cobrança, mas vc conseguiu fazer pra mim? Estou travado nisso, aguardando a sua ajuda.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

22/06/2011

Pode deixar, esta noite, monto um arquivo e lhe mando, e depois posto o código aqui caso algué mais precise...


Ok, obrigado pela ajuda. Está me ajudando bastante. Obrigado mesmo. Vou aguardar.


Oi Adalton, não teve tempo de fazer ainda? Estou no aguardo, ok?


Oi Adalton, desculpa a cobrança, mas vc conseguiu fazer pra mim? Estou travado nisso, aguardando a sua ajuda.


Nada Ainda. Aguardando..
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

22/06/2011

Pode deixar, esta noite, monto um arquivo e lhe mando, e depois posto o código aqui caso algué mais precise...


Ok, obrigado pela ajuda. Está me ajudando bastante. Obrigado mesmo. Vou aguardar.


Oi Adalton, não teve tempo de fazer ainda? Estou no aguardo, ok?


Oi Adalton, desculpa a cobrança, mas vc conseguiu fazer pra mim? Estou travado nisso, aguardando a sua ajuda.


Nada Ainda. Aguardando..


Adalton, ainda não postou o exemplo, estou no aguardo ainda..
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

22/06/2011

Pode deixar, esta noite, monto um arquivo e lhe mando, e depois posto o código aqui caso algué mais precise...


Ok, obrigado pela ajuda. Está me ajudando bastante. Obrigado mesmo. Vou aguardar.


Oi Adalton, não teve tempo de fazer ainda? Estou no aguardo, ok?


Oi Adalton, desculpa a cobrança, mas vc conseguiu fazer pra mim? Estou travado nisso, aguardando a sua ajuda.


Nada Ainda. Aguardando..


Adalton, ainda não postou o exemplo, estou no aguardo ainda..


Onde está meu exemplo?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

22/06/2011

Pode deixar, esta noite, monto um arquivo e lhe mando, e depois posto o código aqui caso algué mais precise...


Ok, obrigado pela ajuda. Está me ajudando bastante. Obrigado mesmo. Vou aguardar.


Oi Adalton, não teve tempo de fazer ainda? Estou no aguardo, ok?


Oi Adalton, desculpa a cobrança, mas vc conseguiu fazer pra mim? Estou travado nisso, aguardando a sua ajuda.


Nada Ainda. Aguardando..


Adalton, ainda não postou o exemplo, estou no aguardo ainda..


Onde está meu exemplo?


Esqueceram de mim???
GOSTEI 0
José Curdo

José Curdo

22/06/2011

Além das dicas dos amigos ai, atente para o relatado abaixo:
1- Soluções que assinalam em uma tabela o usuário logado, podem nunca receber um status final de login OFF.  Logo compromete a contagem.
2- Se for controlar os logins no BD, pior ainda, já que em uma aplicação n-Tier, com uma camada física intermediando o meio de campo entre a base de dados e o aplicativo de login, normalmente está debaixo de processo de pooled de conexões.
Sds.
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

22/06/2011

Além das dicas dos amigos ai, atente para o relatado abaixo:
1- Soluções que assinalam em uma tabela o usuário logado, podem nunca receber um status final de login OFF.  Logo compromete a contagem.
2- Se for controlar os logins no BD, pior ainda, já que em uma aplicação n-Tier, com uma camada física intermediando o meio de campo entre a base de dados e o aplicativo de login, normalmente está debaixo de processo de pooled de conexões.
Sds.


Estou com dificuldade em fazer isso por ser minha primeira vez programar para isso. Teria algum exemplo?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

22/06/2011

Além das dicas dos amigos ai, atente para o relatado abaixo:
1- Soluções que assinalam em uma tabela o usuário logado, podem nunca receber um status final de login OFF.  Logo compromete a contagem.
2- Se for controlar os logins no BD, pior ainda, já que em uma aplicação n-Tier, com uma camada física intermediando o meio de campo entre a base de dados e o aplicativo de login, normalmente está debaixo de processo de pooled de conexões.
Sds.


Estou com dificuldade em fazer isso por ser minha primeira vez programar para isso. Teria algum exemplo?


Ninguém?
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

22/06/2011

Adalton Goncalves,

Poderia enviar o exemplo para mim, estou precisando. Meu email é: frederico.brigatte@gmail.com
GOSTEI 0
Frederico Brigatte***

Frederico Brigatte***

22/06/2011

Adalton Goncalves,

Espero um retorno seu, ainda não consegui fazer isso.
GOSTEI 0
POSTAR