2011-10-25 8 views
25

Questo deve essere un problema comune ... e sento che dopo aver fatto ricerche su Google, e SOing, non dovevo semplicemente guardarmi intorno abbastanza per la risposta o che no1 l'aveva chiesto ... quindi per favore perdonami.Come ricaricare Principal Security Spring dopo l'aggiornamento in Hibernate?

Sto usando Primavera di sicurezza con Hibernate, ecc

Quindi un utente/principal ha effettuato l'accesso e ha apportato alcune modifiche al proprio profilo.

Uso il mio DAO per aggiornare il profilo (UserDetails) e desidero che il mio preside rifletta automaticamente questo aggiornamento.

Tuttavia quando ottengo di nuovo il preside, ottengo la versione sporca (dal mio login iniziale).

Qualcuno sa di come Spring Security possa ricaricare da Hibernate gli UserDetails aggiornati?

+0

OK Ho trovato qualcosa che mi ha aiutato http://stackoverflow.com/questions/2398224/spring-security-autowire-providermanager Ottenere il Gestore del provider mi ha permesso di riautenticare. Ora il problema sembra essere che il nuovo Principal ha tutti i riferimenti periferici pigri inizializzati che causano il lancio di eccezioni più avanti sulla linea – alwinc

+0

Questo è davvero più un problema di strategia Hibernate/ORM, e non tanto un problema di Spring Security, sebbene ... destra? –

+1

Sì, ho esaminato un po 'di più e sembra che Spring Sec rende gli UserDetails immunizzabili per motivi di sicurezza. Pertanto, la procedura migliore consiste nel re-accedere ai dettagli utente forzandoli a immettere nuovamente la propria password. – alwinc

risposta

41

OK scavare e finalmente trovato la risposta.

Siamo in grado di creare un nomeutentePasswordAuthenticationToken e assegnare il Principal aggiornato al contesto.

Authentication authentication = new UsernamePasswordAuthenticationToken(userObject, userObject.getPassword(), userObject.getAuthorities()); 
SecurityContextHolder.getContext().setAuthentication(authentication); 

Vedere anche "How to manually set an authenticated user in Spring Security/SpringMVC".

+6

La tua soluzione funziona. Tuttavia, userei un 'PreAuthenticatedAuthenticationToken' invece di un' UsernamePasswordAuthenticationToken'. Questo fondamentalmente fa la stessa cosa: aiuta solo a chiarire il tuo intento e migliora la leggibilità del tuo codice –

Problemi correlati