2011-12-18 19 views
5

Zajmuję się tworzeniem aplikacji webowej, która używa Spring Security jako warstwy bezpieczeństwa.Zapisywanie czasu zalogowania i czasu trwania sesji - Java - Spring Security

Jedną z istotnych funkcji jest dla nas wiedza, który użytkownik uzyskuje dostęp do aplikacji i ile czasu na nią spędzają.

Nie jestem pewien, jak sobie z tym poradzić. Czy istnieją inne ramy, które dotyczą tego rodzaju statystyk użytkowania?

Czy jest jakiś sposób wykorzystania samego Spring Security do poradzenia sobie z tym?

// Czytam więcej o Spring Security i wygląda na to, że jego filtry mogą mi pomóc. Wszelkie postępy zostaną udostępnione tutaj.

Odpowiedz

5

Myślę, że jednym z rozwiązań może myślę stosuje HttpSessionListener, Jeśli zaimplementować słuchacza sesji może uchwycić czas, jak i kiedy nowa sesja użytkownika jest tworzony i zniszczone, można wykorzystać Twój wiosna uchwyt kontekstu zabezpieczeń, aby uzyskać luku UniqueName/identyfikatora użytkownika zalogowanego w użytkownik

mam na myśli kilka rzeczy jak ten

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 
} 
} 

takiej sytuacji istnieje kilka stron w dół do T jego podejście, jeśli sesja HTTP nigdy nie zostanie unieważniona, to skończy się kilka sesji bez czasu zakończenia.

  • Jeśli można delikatnie prod swoją bazę użytkowników do logowania się cały czas jako dobrej praktyki (choć nie jest to praktyczne rozwiązanie)
  • Można zrobić może być ciało na obciążenia i sprawdzić, czy użytkownik opuszcza swoją domenę lub wykorzystywane oknom przycisk zamknij, aby zamknąć okno i ogień invalidate sesji uchwycić czas zakończenia

UPDATE

reprezentujesz re right Myślę, że mógłbyś użyć mechanizmu zdarzeń aplikacji wiosennej, aby to dodać do twojego web.xml, Ten detektor publikuje zdarzenia sesji HTTP, inaczej nie będziesz mieć dostępu do zdarzeń sesji, nawet jeśli implementujesz ApplicationListener

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

teraz dodać nową klasę, która implementuje 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()); 
    } 


} 

} 

Nie ma innego zdarzenia, jeśli chcesz uchwycić wylogowania przez siebie, można zaimplementować LogoutHandler który daje dostęp do logut wydarzenie.

+0

Wygląda na to, że filtry Spring Security pozwalają mi rejestrować się, gdy użytkownik jest zalogowany i wylogowany.Rozwiązanie będzie przechowywane w bazie danych (jak już wspomniano) userID, czas logowania i czas wylogowania, używając filtrów bezpieczeństwa! –

0

Może szukasz czegoś takiego:

Narzędzie do śledzenia bieżących użytkowników na swojej stronie, i gdzie oni byli w szczegółach. Pozwala to śledzić "strumienie kliknięć" lub "ścieżki ruchu" w Twojej witrynie.

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

+0

Hm, nie jestem pewien, czy to dobry wybór. Wygląda na to, że OpenSymphony zamknęło swoje drzwi i ten projekt został przerwany. –

Powiązane problemy