mvc - spring security xml
¿Es posible invalidar una sesión de seguridad de primavera? (4)
El objeto HTTPSession tiene un método de invalidación. Cuando un usuario cambia algunos permisos, debe llamar a este método para invalidar y volver a cargarlos para la sesión actual.
Estoy usando Tomcat 6.0.32, Spring Security 3.0.5
En mi aplicación web, algunos usuarios tienen la capacidad de cambiar los privilegios de otros usuarios. Cuando esto sucede, me gustaría invalidar cualquier sesión para el usuario cuyos privilegios se cambiaron. ¿Es posible? y si lo es, ¿cómo?
Normalmente no puede invalidar una sesión de usuario inmediatamente si cambia la información de su cuenta sin recurrir a una API específica del contenedor, ya que la única forma de acceder a la HttpSession
es a través del objeto HttpServletRequest
.
En su lugar, puede almacenar en caché el nombre de usuario en una tienda en memoria y consultarlo en un filtro o en un AccessDecisionVoter
personalizado. Usar una bandera en la tabla de usuarios no es realmente una gran idea, ya que la bandera es de naturaleza transitoria (es irrelevante después de reiniciar el servidor) y es mejor evitar el golpe de rendimiento de una consulta de base de datos en cada solicitud.
Hay un artículo de blog sobre el uso de votantes personalizados para este tipo de cosas. Está desactualizado, pero el enfoque general es sólido.
Otro enfoque es usar SessionRegistry
Spring Security, que es parte de la funcionalidad de gestión de sesiones. Normalmente esto se usa para limitar el número de sesiones que un usuario puede tener, pero también se puede usar para listar usuarios actualmente autenticados o marcar su sesión para caducidad.
También podría ser una idea simplemente volver a cargar los privilegios del usuario, en lugar de cerrarlos por completo.
Creo que esto es lo que necesita: obtener una lista de los usuarios que inician sesión e invalidar las sesiones de aquellos que no necesita.
Suponiendo que está ejecutando su aplicación en varios servidores, necesitará tener una forma de hacer que esto suceda en todos los servidores.
Agregue un campo de marca de tiempo a su tabla de usuario (o equivalente) que se actualiza cuando se modifica una prvis del usuario.
Escriba un filtro de servlet que verifique si la sesión actual está autenticada Y la marca de tiempo para el usuario en el DB es mayor que la hora de creación de la sesión. Si es así invalidar la sesión y redirigir a alguna parte.
Este filtro deberá venir después del filtro Spring Security.
Si no está ejecutando su aplicación en varios servidores, entonces puede usar SessionRegistry.