2009-12-08 13 views
20

Quando Spring Security autentica l'utente, crea un oggetto UserDetail ed è disponibile per trovare l'ID utente corrente nell'applicazione Web. Ma diciamo che voglio mantenere un oggetto utente personalizzato con preferenze e altri dettagli insieme a UserDetails o a Replacing UserDetails.Come gestire un oggetto utente personalizzato in sessione quando Spring Security autentica l'utente?

Quindi, come aggiungere l'oggetto Utente personalizzato alla sessione quando Spring Security autentica correttamente ? E come rimuovere l'oggetto utente personalizzato dalla sessione quando Spring Security disconnette l'utente registrato.

Oppure esiste un modo appropriato per farlo?

+2

Mi piace quando qualcuno chiede esattamente quello che voglio chiedere! – Adelin

risposta

18

Il modo migliore per eseguire questo IMO è disporre di uno dei servizi (probabilmente UserService) implementare UserDetailsService e specificare nel codice XML di sicurezza che si desidera utilizzare il proprio servizio di dettagli utente.

Ciò che UserDetailsService dovrà eseguire è implementare un metodo loadByUsername (String username). Questo metodo dovrà restituire una classe che implementa UserDetails. Questo può essere il tuo oggetto personalizzato che memorizza ciò che vuoi. Il vantaggio di questo è che è possibile accedere alle proprietà dell'oggetto da un JSP tramite taglib di sicurezza di primavera ed è anche sempre disponibile dal security singleton SecurityContextHolder (thread safe) in spring security.

Ecco un link per la documentazione per questo: spring security manual, chapter 8 Ecco un post parlando di attuazione di un servizio personalizzato dettagli utente per la crittografia della password: example usage

Spero che questo aiuti

Edit: dimenticato di dire che l'oggetto verrà rimosso dal contesto di sicurezza e dalla sessione al logout. Questo è ciò che è più utile al riguardo, è completamente gestito dalla sicurezza di primavera.

0

È assolutamente necessario scrivere il proprio UserDetailService. Nell'oggetto Principal c'è l'utente e c'è anche un oggetto Details nello AuthenticationToken che è possibile memorizzare una Map (String, String) di altre informazioni di login.

public class RequestFormDeatils extends SpringSecurityFilter { 

    protected void doFilterHttp(HttpServletRequest request, ...) { 
     SecurityContext sec = SecurityContextHolder.getContent(); 
     AbstractAuthenticationToken auth = (AbstractAuthenticationToken)sec.getAuthentication(); 
     Map<String, String> m = new HashMap<String, String>; 
     m.put("myCustom1", request.getParameter("myCustom1")); 
     m.put("myCustom2", request.getParameter("myCustom2")); 
     auth.setDetails(m); 
} 

Ora qualsiasi punto del codice si ottiene l'uso della SecurityContext per propagare queste informazioni relative alla sicurezza, senza dover paio al vostro UserDetails oggetto o passarlo come argomenti. Faccio questo codice in un SecurityFilter alla fine della catena del filtro di sicurezza Spring.

<bean id="requestFormFilter" class="...RequestFormDetails"> 
    <custom-filter position="LAST" /> 
</bean> 

Queste informazioni verranno rimosse quando l'utente viene rimosso (come a logout).  

Problemi correlati