Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Controle de usuários logados

Boa tarde pessoal.

Eu preciso controlar por empresa a quantidade de usuários logados simultâneamente. Conforme o valor pago por eles terá uma limitação. Mas não vou limitar a quantidade de logins que ele pode cadastrar. Somente a quantidade de acessos simultâneos. Eu pensei em criar um bean ApplicationScoped que a cada login eu verifico quem está conectado por empresa e caso ele possa logar eu incluo ele num map para poder consultar depois. Se o usuário clicar em logout eu tiro ele do map. Só que 1% ou menos dos usuários clicam em logout. Todos fecham o browser direto.

Com o cenário acima como eu posso criar um controle efetivo para isso? Eu dei uma olhada no Spring Security mas pelo que li ele não controla isso.

Obrigado.

5 respostas

Fala Claudio, tudo bem?

Pelo backend não é possível fazer isso pois é necessário fazer uma requisição para encerrar a sessão ou esperar pelo timeout do servidor.

O que pode ser feito no frontend é chamar via js o evento onbeforeunload no elemento window e passar a função de logoff.

Para saber mais sobre o evento, segue o link : https://www.w3schools.com/jsref/event_onbeforeunload.asp

Abraço

Obrigado pela resposta Samir.

Eu já tinha pesquisado esse evento e ele é altamente desaconselhado para o que eu preciso (pelo menos no stackoverflow o @BalusC sempre frisa isso que não funciona para métodos backing bean).

Deixa eu complementar porque não respondi direito. Você me informou que não dava pra fazer pelo backend e eu desconsiderei na resposta. Via js da maneira que você me falou eu não vou conseguir controlar os usuários logados. Ainda que o js chame alguma função se ela não passar pelos meus beans não vai me ajudar. Pelo que eu estou vendo a única solução será eu limitar a quantidade de logins criados em conformidade com o plano escolhido. Se alguém tentar logar com o mesmo login em máquinas diferentes eu invalido o login mais antigo porque a hash de acesso dele será diferente.

Obrigado pela ajuda.

solução

Uma outra solução é diminuir o tempo do timeout do servidor e encerrar a sessão do usuário mais rápido, assim qdo ele fechar o browser vai ficar sem atividade e deslogar. Além disso, quando atingir o limite vc pode enviar uma msg com os usuários logados dizendo que esse novo usuário precisa esperar alguém deslogar, isso talvez mude a cultura da empresa para apertar o botão deslogar. Claro, tudo isso depende da sua regra de negócio e etc, mas talvez seja uma outra solução.

Diminuir o timeout me traz dor de cabeça. Eu tinha com 10 minutos e os usuários reclamavam que toda hora tinham que ficar relogando. Vou fazer da maneira que eu tinha pensado. Vou limitar a quantidade de logins que o cliente pode criar com base no plano escolhido por ele.

Mais uma vez obrigado pela ajuda.