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