È ansible invalidare una sessione di sicurezza di spring?

Sto usando Tomcat 6.0.32, Spring Security 3.0.5

Nella mia app web alcuni utenti hanno la possibilità di modificare i privilegi di altri utenti. Quando ciò accade, desidero invalidare qualsiasi sessione per l’utente di cui sono stati modificati i privilegi. È ansible e se sì, come?

Di solito non puoi invalidare una / e sessione / i utente / i immediatamente cambia le informazioni dell’account senza ricorrere a un’API specifica del contenitore, poiché l’unico modo per accedere a HttpSession è attraverso l’object HttpServletRequest .

Invece è ansible memorizzare nella cache il nome utente in un archivio in memoria e consultarlo in un filtro o in un AccessDecisionVoter personalizzato. L’utilizzo di un flag nella tabella utente non è davvero una grande idea, dal momento che il flag è di natura transitoria (è irrilevante dopo il riavvio del server) ed è meglio evitare il riscontro di prestazioni di una query di database su ogni richiesta.

C’è un articolo sul blog sull’utilizzo di elettori personalizzati per questo genere di cose. È obsoleto ma l’approccio generale è valido.

Un altro approccio consiste nell’utilizzare SessionRegistry Spring Security che fa parte della funzionalità di gestione delle sessioni. Normalmente questo viene usato per limitare il numero di sessioni che un utente può avere ma può anche essere usato per elencare gli utenti attualmente autenticati o contrassegnare la loro sessione per la scadenza.

Potrebbe anche essere un’idea per ricaricare i privilegi dell’utente, piuttosto che disconnetterli completamente.

Credo che questo sia ciò di cui hai bisogno: ottieni un elenco degli utenti registrati e invalidi le sessioni di quelli che non ti servono.

http://static.springsource.org/spring-security/site/docs/3.1.x/reference/session-mgmt.html#list-authenticated-principals

Supponendo che tu stia eseguendo la tua app su più server avrai bisogno di un modo per farlo accadere su tutti i server.

  1. Aggiungi un campo data / ora alla tua tabella utente (o equivalente) che viene aggiornata quando un utente prvis viene modificato.

  2. Scrivi un filtro servlet che controlla se la sessione corrente è autenticata E il timestamp per l’utente nel DB è maggiore del tempo di creazione della sessione. Se così invalidare la sessione e redirect da qualche parte.

Questo filtro dovrà venire dopo il filtro Spring Security.

Se non stai eseguendo la tua app su più server, puoi utilizzare SessionRegistry.

L’object HTTPSession ha un metodo invalidato. Quando un utente modifica alcune autorizzazioni, è necessario chiamare questo metodo per invalidarle e ricaricarle per la sessione corrente.