2011-12-18 16 views
5

Estoy desarrollando una aplicación web que utiliza Spring Security como capa de seguridad.Mantener registro del tiempo de inicio de sesión y la duración de la sesión - Java - Spring Security

Una característica importante para nosotros es saber qué usuario está accediendo a la aplicación y cuánto tiempo están gastando en ella.

No estoy seguro de cómo lidiar con eso. ¿Hay algún otro marco que se ocupe de este tipo de estadísticas de uso?

¿Hay alguna forma de usar Spring Security para manejarlo?

// Estoy leyendo más sobre Spring Security y parece que sus filtros pueden ayudarme. Cualquier progreso será compartido aquí.

Respuesta

5

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.

+0

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. –

0

Quizás esté interesado en algo como esto:

Utilidad para realizar un seguimiento de los usuarios actuales en su sitio, y dónde han estado en detalle. Esto le permite rastrear 'secuencias de clics' o 'rutas de tráfico' en su sitio.

http://www.quartzscheduler.org/clickstream/

+0

Hm, no estoy seguro de si es una buena opción. Parece que OpenSymphony ha cerrado sus puertas y este proyecto ha sido descontinuado. –

Cuestiones relacionadas