2013-06-14 11 views
5

Nella mia applicazione, ho un amministratore che può cancellare utenti. quindi, quando elimino un utente dalla sessione di amministrazione, voglio che l'utente eliminato venga disconnesso automaticamente. Conosco l'id di sessione dell'utente che cancello ma non so come invalidare una sessione usando l'id di sessione.Distruggi una sessione di un altro utente in primavera

Vorrei qualcosa come: invalidate (SessionId);

È possibile in qualche modo? Penso che sia possibile utilizzare un filtro e controllare il database ogni richiesta, ma esiste un altro modo in cui non è necessario controllare il db su ogni httprequest?

Grazie. : D

risposta

3

Penso di vedere una soluzione utilizzando l'infrastruttura Spring Security, con la classe SessionRegistry.

si deve registrare il HttpSessionEventPublisher nella web.xml:

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

Nella primavera di configurazione, dichiarare il SessionRegistry.

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

Nella console di amministrazione, è necessario utilizzare il SessionRegistry per recuperare il SessionInformation dell'utente e chiamare expireNow. Alla successiva richiesta dell'utente, un filtro servlet dovrebbe far scadere la sessione HttpSession. Il javadoc di SessionInformation ha alcune spiegazioni su come funziona.

Facci sapere se questo ti aiuta.

+0

Ho problemi, ho registrato la sessione chiamando * sessionRegistry.registerNewSession (String session, Object principal) * quando elimino l'utente, ottengo la sessione correttamente e chiamo * sessionInformation.expireSession() * nel controller ma non ha funzionato la sessione dell'utente è ancora funzionante – Josema

+1

Ho letto nuovamente [docs] (http://static.springsource.org/spring-security/site/docs/3.0.x/reference/session-mgmt.html), e Penso che devi anche aggiungere '' alla sezione '' della tua configurazione di sicurezza di Spring. Spero che sarà di aiuto. – 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

Insieme a ciò che è stato suggerito da @LaurentG, a seguito deve essere aggiunto nel file di configurazione di primavera:

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

per farlo funzionare. Anche la risposta @zygimantus può essere utilizzata per accedere ai dati della sessione.