bloquear acesso simultâneo
25/07/2012 19:23
0
Olá gente,

Como posso fazer para impedir o acesso simultâneo ao sistema, ou seja, impedir que o mesmo usuário esteja logado no sistema simultaneamente em mais de um computador.

Estava pensando em levantar uma flag no banco quando o usuário logar e baixar quando ele deslogar ou quando o timeout da sessão chegar ao fim.

Isso funciona?

Dicas e experiências são muito bem vindas!
Grato.
Tags: simultâneo, bloquear


0
Fala Brother, nunca precisei fazer algo desse tipo, mas creio que vc está no caminho certo! em criar uma flag! Chegou a pesquisar se existe algo que possa te auxiliar nisso?


1
Num projeto que eu trabalhei em JSF, tinha um map [usuario:sessao] que era atributo global da aplicação.

Dae sempre que o usuário logava, procurava nesse map o usuario. Se existisse, dropava a sessão antiga, caso não existisse, era adicionado na lista.
Dae garantia que só tinha um usuário logado com aquele usuário.
Quando o cara deslogava ou dava timeout, tirava o usuario e sessão do map tbm.

Esse projeto era em JSF, mas acho que a idéia da pra transportar pro grails....

eu acho que com esse carinha o servletContext dá pra fazer isso que eu falei:
http://grails.org/doc/latest/ref/Controllers/servletContext.html
25/07/2012 20:06


1
João,

acredito que a melhor solução seja usar Listener. É que nem sempre a sessão será encerrada por vontade do usuário. Ele pode ir almoçar sem clicar no botão "sair". Dai só um Listener consegue saber que a sessão morreu.

No mais, concordo com a solução do mussatto: verifique em Controllers se o usuário está no contexto de aplicação. Fiz um pequeno Listener que faz o que te ajuda a cumprir essa tua missão:



public class ListenerUsuarios implements HttpSessionListener, HttpSessionAttributeListener {

void removerUsuario(HttpSession sessao) {
Map mapUsuarios = sessao.servletContext.getAttribute('mapUsuarios')
if (!mapUsuarios) return
mapUsuarios.remove(sessao.getAttribute('usuarioAtual'))
sessao.servletContext.setAttribute('mapUsuarios', mapUsuarios)
}

public void sessionCreated(HttpSessionEvent event) {

}

public void sessionDestroyed(HttpSessionEvent event) {
removerUsuario(event.getSession())
}

public void attributeAdded(HttpSessionBindingEvent event) {
if (event.name=='usuarioAtual') {
Map mapUsuarios = event.session.servletContext.getAttribute('mapUsuarios')?:[:]
mapUsuarios+=['usuarioAtual':event.value]
event.session.servletContext.setAttribute('mapUsuarios', mapUsuarios)
}

}

public void attributeRemoved(HttpSessionBindingEvent event) {
if (event.name=='usuarioAtual')
removerUsuario(event.getSession())
}

public void attributeReplaced(HttpSessionBindingEvent event) {

}

}


0
Valeu Gabriel, Mussato e Yoshiriro.
Vou tentar implementar as dicas.
Até +
26/07/2012 21:56


0
Yoshiriro, tentei colocar em prática a tua solução mas não estou conseguindo.
coloquei a classe dentro de scr/groove e inseri o listener no web.xml mas a aplicação fica reiniciando a todo momento. O que pode ser?
09/08/2012 13:08


0
João, você fez o install-templates antes?


0
Sim, fiz esse passo sim.
09/08/2012 16:24


0
Yoshiriro? Pode me ajuar?
10/08/2012 15:53


0
Olá, João.

como asssim "a aplicação fica reiniciando a todo"?

Pode mandar o código do teu Listener?


0
Coloquei o listener abaixo para testar, mas daí a aplicação fica reiniciando no servidor.


public class ExpiringSessionEventListener implements HttpSessionListener {

public void sessionCreated(HttpSessionEvent event) {

System.out.println("Session created");
}

public void sessionDestroyed(HttpSessionEvent event) {

System.out.println("Session destroyed");
}

}

Estou meio perdido.
11/08/2012 03:30


0
Que estou fazendo de errado?
Alguma dica?
20/08/2012 19:15



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto