Spring Security Limitar Sessões por Usuário[Resolvido]

Bom dia Senhores(as) do GUJ

Algum de vocês já passou pela necessidade de limitar número de sessões por usuário com Spring Security.

Tipo, tenho a necessidade de limitar 1 usuário logado por login, se houver mais de um exibir uma mensagem informando que
já existe uma sessão ativa para aquele usuário e não é possível criar uma nova.

Desde já, brigadão pela atenção !!!

Tem como você limitar isso por filter normal, tem não?

Veja se o cara já está logado, se estiver bloqueie a nova tentativa.

Esse é um dos motivos de pq eu desisti do spring security…ele não faz e para vc manualmente adicionar esse serviço no framework é um transtorno…detalhe quando muda a versão, quebra todo seu código.

Então …

Não teria como fazer isso via o Spring Security ???

[quote=Psytheory]Então …

Não teria como fazer isso via o Spring Security ???[/quote]

  1. Ele não faz.
  2. Vc vai ter adicionar isso nele.

E como eu poderia adicionar essa regra nele ?

Estudar a API dele e acrescentar mais um nivel de validação na sequencia de execução do filtro de segurança

Aqui eu limitei assim:

		<session-management invalid-session-url="/login.jsf?session=1">
			<concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
		</session-management>

Coloquei esse código dentro do do application context do spring security e resolvi meu problema

Boaaa dica nazarenoneto !!! :slight_smile:

Mas desse modo apenas limitaria o número máximo de sessões, certo ?

E se eu tivesse um usuário por exemplo com o nome de user e eu apenas fosse permitir uma sessão para esse user de modo que
se ele deixasse uma sessão aberta em uma máquina e tentasse abrir uma outra sessão em outra máquina sem deslogar da máquina anterior
fosse impedido ?

Eu não tenho certeza, mas acho que desse modo, ele faz isso, se você tiver logado em uma maquina, na outra você não consegue logar, até que você faça o logoff na primeira maquina.

nazarenoneto,

Você tem razão, faz sim !!! :smiley:

Show de bola a dica, brigadão pelo help !!!

Abração mano

Há um tempo atrás eu queria fazer exatamente isso.
O problema é se o usuário não fez logoff, mas simplesmente fechou o browser. A sessão vai continuar ativa até que o tempo definido no session-timeout acabe. Teste isso e nos conte o que acontece.

nazarenoneto,

Para fazer essa alteração você precisou alterar algo na tag de logout do springsecurity ?

Pois ao fazer logout não consigo mais realizar o login.

Tentei usar o delete-cookies=“JSESSIONID” na tag do logout, mas retorna erro. =/

Hehe …

Erro meu … é necessário configurar o listener no web.xml :smiley:

<listener-class> org.springframework.security.web.session.HttpSessionEventPublisher </listener-class>

Por que não usar o padrão de projeto “Singleton” para fazer esse trabalho?

[quote=davinc131]Por que não usar o padrão de projeto “Singleton” para fazer esse trabalho?
[/quote]

Eu tenho a impressão de que não funcionaria (e pra mim - e mais um monte de gente também - Singleton é anti-pattern)… você poderia nos mostrar como?