2011-01-06 14 views
6

necesito invalidar (o patear) la sesión del usuario. la aplicación solo limita el inicio de sesión de usuario solo a un usuario por contenedor.Invalidar la sesión de seguridad del resorte

trato de llamar a removeSessionInformation desde el registro de la sesión, se hace para desbloquear el usuario. para que el otro usuario pueda iniciar sesión con el nombre de usuario de la sesión pateada.

pero SessionContextHolder en ese usuario que ha sido expulsado es todavía. por lo que todavía tienen la misma autoridad para acceder a la página protegida.

cómo invalidar o eliminar el principal de SessionContextHolder de la información de registro de sesión especificada?

ps: en mi aplicación anterior, doy una variable en UserDomain (UserDetails) que contienen HttpSession. y cuando necesitan patear al usuario, simplemente invalido HttpSession del UserDomain especificado. pero no sé cómo hacerlo en primavera (es más fácil eliminar el Principal de SessionContextHolder que HttpSession). la implementación es casi la misma que con SessionRegistryImpl en la primavera.

Respuesta

10

Es posible que desee considerar control de concurrencia Spring Security. Puede configurar esto para limitar el número de sesiones simultáneas por usuario y caducar (patear) sesiones existentes si se excede ese número.

Spring Security Session Management

Este es un fragmento de nuestra configuración (Spring 3):

<http> 
    ... 
    <session-management> 
     <concurrency-control max-sessions="1"/> 
    </session-management> 
    ... 
</http> 
7

supongo que esta es la manera de hacerlo:

SecurityContextHolder.getContext().setAuthentication(null) 

De los SecurityContext.setAuthentication(Authentication) Javadocs:

Cambia el autenticado actualmente director o elimina la información autenticación.

Parámetros: autenticación
- el nuevo token de autenticación , o NULL si no hay más información de autenticación se debe almacenar

+0

Esta respuesta es correcta, pero asegúrese de invalidar su sesión web. –

+1

hi brian, creo que tu respuesta solo invalida (o elimina) 'SecurityContextHolder' de la sesión de usuario de la sesión actual. lo que necesito es eliminar el 'SecurityContextHolder' de otra sesión de usuario. ¿Podemos hacerlo en sping? –

+0

esto no es para otros usuarios – z0mb1ek

0

Esto se extrae de mi solicitud-security.xml

class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy" 
     p:maximumSessions="1" <br> 
        **p:exceptionIfMaximumExceeded="true"** > 
     <constructor-arg name="sessionRegistry" ref="sessionRegistry" /> 

intento de añadir la línea en letras en negrita después del número máximo de sesiones

6

También puede hacer lo siguiente para borrar la sesión SpringSecurity:

SecurityContextHolder.clearContext() 
Cuestiones relacionadas