Fórum Impedir Login em Duplicidade #289687

27/07/2005

0

No meu sistema faço o controle manual do acesso de cada usuário a cada módulo. Atribuo níveis de acesso e só permito que um usuário acesse determinado módulo se o usuário administrador lhe concedeu autorização para isso. Guardo os dados de cada usuário em uma tabela.
Até aqui tudo certo.
Minha dúvida: preciso fazer uma rotina para impedir que um mesmo usuário se logue duas vezes. Por exemplo, o usuário X acessa o programa no servidor e, sem efetuar o logoff, se loga também na estação. Pensei em criar um campo - Logado - na tabela de usuários e gravar o log ali e, quando fizer o logoff ou sair do programa, liberar o acesso daquele usuário novamente. Seria o ideal. O problema é se ocorre um desligamento inesperado do micro - uma queda de energia por exemplo. O sistema não faria a liberação daquele usuário e ele não poderia mais se conectar no programa.

Alguém tem alguma idéia de como eu poderia fazer isso?
Obrigado.


Valdirdill

Valdirdill

Responder

Posts

27/07/2005

Rjun

Poderia ter uma tabela em que o sistema registrasse o usuario logado. Quando o sistema fechasse ele apagaria esse registro. Caso caia a energia, na próxima inicialização do sistema ele verificaria que existe um usuário logado e apagaria o registro liberando o usuário.


Responder

Gostei + 0

27/07/2005

Valdirdill

Não funciona.
E se o usuário se logar no servidor e, sem sair do programa, for numa estação e tentar se logar.
Por essa sua sugestão, quando o usuário tentasse se logar na estação, o sistema apagaria e liberaria para ele entrar novamente.
Entendeu?


Responder

Gostei + 0

27/07/2005

Rjun

A sugestão que dei foi para complementar a sua. Se ele estivesse logado no servidor não conseguiria logar em outra máquina.

1. Ele se loga no servidor. A aplicação registraria que ele o usuario ZÉ se logou e também registraria no login ZÉ que ele esta conectado.

2. Quando o usuário tentasse se logar em outra máquina o login dele estaria bloqueado.

3. Somente quando o usuário desligasse a aplicação em que ele está logado, na finalização da aplicação ela faria o registro de que naquela máquina ninguem está registrado e também liberaria o login do ZÉ.

4. Se caisse a luz, quando a maquina fosse reinicializa, ela verificaria que o ultimo usuario nao se deslogou e faria as liberações.


Responder

Gostei + 0

27/07/2005

Valdirdill

Obrigado RJun. Desculpe a minha ignorância, mas não estou conseguindo fazer a rotina que vc sugere.

Vamos a um exemplo mais prático:

1) Quando o usuário Zé acessar o programa no serivdor, atribuo ´S´ para o campo LOGADO na tabela de cadastro de usuários.

2) Se ele tentar acessar o programa na estação, verifico que o campo LOGADO do BD está como ´S´ e não permito que acesse. No servidor ele não vai conseguir se conectar de novo, pois o programa não abre mais de uma vez simultaneamente na mesma máquina;

2) Quando o Zé sair do sistema no servidor, atribuo ´N´ parar o campo LOGADO. Agora, se ele for na estação e tentar acessar o programa, vai conseguir. Normal. Até aqui tudo certo, né?;

É assim que eu tinha feito.
Como eu diferencio, no passo 2 acima, se o campo LOGADO do registro Zé está como ´S´ porque o Zé ainda não saiu ou porque a energia havia caído?


Obrigado.


Responder

Gostei + 0

27/07/2005

Rjun

Nesse ponto acho que você deveria ter mais uma coluna na tabela de usuário, com o nome da maquina. Quando o usuario logasse colocaria ´S´ no campo logado e preencheria o campo MAQUINA com o nome da máquina. Quando o usuário se deslogar, coloca ´N´ e apaga o nome da máquina. Se cair a energia, quando a aplicação for reinicializada, ela varre a tabela de usuário e verifica se o nome da maquina esta em algum registro. Se estiver ela apagar o nome da máquina e altera o estado para ´N´.


Responder

Gostei + 0

27/07/2005

Guilherme

valdirdill eu estou com o mesmo problema seu !!!!

Eu pensei em fazer assim:
assim que o usuario logar o nome do mesmo sera gravado em uma variavel, assim antes de logar o sistema iria ´conversar´ com todas outras estaçoes perguntando o valor da variavel que esta armazenado o nome do usuario ai caso alguma extaçao tenha a variavel com o mesmo nome de usuario o logon nao sera feito caso contrario sera logado normal isso tudo usando sockets (so que nao sei usar estou procurando material), assim evitaria o problema do usuario ficar logado no banco de dados em caso de queda de energia etc....


o q vc´s acham ??????

acho que o unico problema é que nao sei usar os sockets (Espero que vc´s saibam :D )


Responder

Gostei + 0

27/07/2005

Fabio Nascimento

valdirdill, a sua idéia é perfeita, faça desse jeito.

Não é possível prever uma queda de energia, e com certeza, aonde o seu sistema está funcionando, alguém tem que ter um login com provilégios de ´admin´.

Caso haja uma queda de energia, como isso é uma excepcionalidade, algo que com certeza não vai acontecer com frequencia, esse ´admin´, terá poderes para apagar o registro que vai estar bloqueando o acesso de quem estava logado no momento da queda.

Logo, apenas adicione um usuário que possa logar sem restrições e que possa alterar os registros dessa tabela que controla os acessos.


Responder

Gostei + 0

28/07/2005

Guilherme

cara eu particularmente nao gosto de tratar isso em uma tabela nao pois ja passei muita raiva :x usando dessa maneira, ainda prefiro aprender usar os sockets para fazer como disse !!!!!!


Mais estamos aki para achar uma forma de fazer isso !!!!!! Vao postando suas ideias :idea: !!!!!!


Responder

Gostei + 0

28/07/2005

Beppe

Não vejo problemas disso ser feito com um campo numa tabela. Pode ser um timestamp, com isso dá pra estimular um timeout.

Com sockets é meio inviável, ao menos dá mais trabalho, pois ainda é preciso saber quem se logou.


Responder

Gostei + 0

28/07/2005

Guilherme

mais trabalhoso é sim !!!!!!

sei temos q usar alguma campo a caso o sistema ´caia´ ele fique totalmente em banco novamente !!!! nao sei si estou certo pois nunca usei mais acho q um campo calculado faz isso ne ???????


Responder

Gostei + 0

28/07/2005

Beppe

mais trabalhoso é sim !!!!!! sei temos q usar alguma campo a caso o sistema ´caia´ ele fique totalmente em banco novamente !!!! nao sei si estou certo pois nunca usei mais acho q um campo calculado faz isso ne ???????

Campo calculado não é pra isso, mas a idéia é boa sim. Com n-camadas dá pra implementar isso, mas de forma geral, ao se conectar ao banco deve ser feito up UPDATE que limpasse os campos.


Responder

Gostei + 0

28/07/2005

Guilherme

pode ser um campo ´virtual´ ou algo parecido !!!!


Responder

Gostei + 0

28/07/2005

Beppe

pode ser um campo ´virtual´ ou algo parecido !!!!

E como vc iria indicar que um usuário se logou?


Responder

Gostei + 0

28/07/2005

Guilherme

no sistema q uso esse tipo de logon pela tabela um faço assim :

eu bloqueio nos edit o uso do coringa ´´¬´´ (uso ib)
ai eu coloco um ibdataset (aba interbase)
coloco o seguinte comando no ibdataset

select cod,usuario,senha,conectado,permicoes from funcionarios
where
usuario = :usuario and
senha = :senha


ai no botao logar coloco assim :
begin
ibdataset1.close;
ibdataset1.parambyname(´usuario´).asstring:=edit1.text;
ibdataset1.parambyname(´senha´).asstring:=edit2.text;
ibdataset.open;
if tbdataset1.count = 1 then begin 
//mostra tela e aplica permiçoes 
ibdatasetconectado.value:=´S´;
end else 
//tratamento
end;


e no onclose do mainform assim :
ibdatasetconectado.value:=´N´;


pois o usuario ja esta localizado !!!!!!

:arrow: é +- isso ai pq fiz sem olhar na aplicaçao !!!!!![/code]


Responder

Gostei + 0

28/07/2005

Beppe

Campos calculados(tanto em SQL como em Delphi), só são visíveis pra quem chamou uma query, isto é, cada cliente tem seus dados independentes.


Responder

Gostei + 0

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

Aceitar