Creo que una de las soluciones que se me ocurre es el uso de un HttpSessionListener, Si implementa un oyente Sesión se podía capturar el momento de acuerdo cuando se crea y se destruye una nueva sesión de usuario, Usted podría aprovechar el titular de su contexto de seguridad de resorte para obtener una bodega de la UniqueName/ID de usuario del usuario que ha entrado
Pienso en algo como esto
public class SesssionListenerImpl implements HttpSessionListener
{
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent)
{
String uniqueName = SecurityContextHolder.getContext().getAuthentication().getName();
String sessionId = httpSessionEvent.getSession().getId();
long beginTimeInSeconds = System.currentTimeMillis()/1000;
//create a record and persist to data base with sessionId, uniquename, sessionBeginTime
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent)
{
SecurityContextHolder.getContext().getAuthentication().getPrincipal();
httpSessionEvent.getSession().getId();
long endTime = System.currentTimeMillis()/1000;
//load the record based on sessionId
//update the record with sessionEndTime
}
}
eso se dice que hay pocos lados hacia abajo a T su enfoque, si la sesión HTTP nunca se invalida, terminará con algunas sesiones sin tiempo de finalización.
- Si se pudiera pinchar suavemente su base de usuarios para registrar todo el tiempo como una buena práctica (aunque no es una solución práctica)
- Usted podría hacer posible que el cuerpo de la carga y comprobar si el usuario está dejando su dominio o usado las ventanas botón de cierre para cerrar la ventana y disparar un invalidate sesión para capturar la hora de finalización
ACTUALIZACIÓN
Eres una Estoy en lo cierto, creo que podría usar el mecanismo de evento de la aplicación de primavera, para agregar esto a su web.xml. Este oyente publica eventos de sesión HTTP. De lo contrario, no podrá acceder a eventos de sesión aunque implemente ApplicationListener
<listener>
<listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>
Ahora añade una nueva clase que implementa ApplicationListener
@Service
public class ApplicationSecurityListener implements ApplicationListener<ApplicationEvent>
{
@Override
public void onApplicationEvent(ApplicationEvent event)
{
if (event instanceof AuthorizationFailureEvent)
{
AuthorizationFailureEvent authorizationFailureEvent = (AuthorizationFailureEvent) event;
System.out.println ("not authorized:" + authorizationFailureEvent);
}
else if (event instanceof AuthenticationFailureBadCredentialsEvent)
{
AuthenticationFailureBadCredentialsEvent badCredentialsEvent = (AuthenticationFailureBadCredentialsEvent) event;
System.out.println ("badCredentials:" + badCredentialsEvent);
}
//login success event
else if (event instanceof AuthenticationSuccessEvent)
{
AuthenticationSuccessEvent authenticationSuccessEvent = (AuthenticationSuccessEvent) event;
//this will provide user id and password but no session, get source has all the user information in security context
System.out.println ("AuthenticationSuccessEvent:" + authenticationSuccessEvent.getSource());
}
//this event will published if you add the HttpSessionEventPublisher to web.xml
else if (event instanceof SessionDestroyedEvent)
{
SessionDestroyedEvent sessinEvent = (SessionDestroyedEvent) event;
System.out.println ("SessionDestroyedEvent:" + sessinEvent.getId());
//load session if it is not empty
if(sessinEvent.getSecurityContext() != null)
{
System.out.println ("SessionDestroyedEvent:" + sessinEvent.getSecurityContext().getAuthentication().getName());
//update the session with endTime
}
}
else
{
//System.out.println ("undefined: " + event.getClass().getName());
}
}
}
Hay otro caso si desea capturar cierre de sesión por sí misma, puede implementar LogoutHandler que le da acceso a logut evento.
Parece que Spring Security Filters me permite registrarme cada vez que un usuario inicia o cierra sesión.La solución persistirá en una base de datos (como dijiste) el ID de usuario, el tiempo de inicio de sesión y el tiempo de cierre de sesión, utilizando los filtros de seguridad. –