2013-06-14 21 views
5

W mojej aplikacji mam administratora, który może usuwać użytkowników. więc gdy usuwam użytkownika z sesji administratora, chcę, aby usunięty użytkownik wylogował się automatycznie. Znam identyfikator sesji użytkownika, którego usunę, ale nie wiem, jak unieważnić sesję przy użyciu identyfikatora sesji.Zniszcz sesję innego użytkownika wiosną

Chciałbym coś takiego: invalidate (SessionId);

Czy to możliwe w jakikolwiek sposób? Myślę, że jest to możliwe przy użyciu filtru i sprawdzanie bazy danych na żądanie, ale czy istnieje inny sposób, w którym nie trzeba sprawdzić db na każdym httpquest?

Dzięki. : D

Odpowiedz

3

Myślę, że widzę rozwiązanie z wykorzystaniem infrastruktury Spring Security z klasą SessionRegistry.

Musisz zarejestrować HttpSessionEventPublisher w web.xml:

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

W swojej wiosennej config, deklarują SessionRegistry.

<bean id="sessionRegistry" 
    class="org.springframework.security.core.session.SessionRegistryImpl" /> 

w konsoli administracyjnej, trzeba użyć SessionRegistry pobrać SessionInformation użytkownika i wywołać expireNow. Na następnym żądaniu użytkownika filtr serwletów powinien spowodować wygaśnięcie sesji HttpSession. Jawadoc z SessionInformation ma kilka wyjaśnień na temat tego, jak to działa.

Daj nam znać, jeśli to pomaga.

+0

Mam problemy, zarejestrowałem sesję wywołującą * sessionRegistry.registerNewSession (sesja ciągów, obiekt główny) * po usunięciu użytkownika, sesja jest poprawna i wywoływam * sessionInformation.expireSession() * w kontrolerze, ale to nie zadziałało. sesja użytkownika nadal działa – Josema

+1

Przeczytałem [docs] (http://static.springsource.org/spring-security/site/docs/3.0.x/reference/session-mgmt.html) ponownie i Myślę, że musisz także dodać '' do '' sekcji twojej konfiguracji bezpieczeństwa Spring. Mam nadzieję, że to pomoże. – LaurentG

3
// to end a session of a user: 
List<SessionInformation> sessions = sessionRegistryImpl.getAllSessions(user, false); 
sessionRegistryImpl.getSessionInformation(sessions.get(0).getSessionId()).expireNow(); 

// note: you can get all users and their corresponding session Ids: 
List<Object> users = sessionRegistryImpl.getAllPrincipals(); 
List<String> sessionIds = new ArrayList<>(users.size()); 

for (Object user: users) { 
    List<SessionInformation> sessions = sessionRegistryImpl.getAllSessions(user, false); 
    sessionIds.add(sessions.get(0).getSessionId()); 
} 
0

Wraz z tym, co zostało zasugerowane przez @LaurentG następstwie należy dodać w pliku konfiguracyjnym wiosny:

<session-management> 
    <concurrency-control session-registry-alias="sessionRegistry" /> 
</session-management> 

go do pracy. Do uzyskania dostępu do danych sesji można również użyć odpowiedzi @zygimantus.