2010-07-20 10 views
6

Nella mia applicazione sto usando l'autenticazione LDAP. Ma ho anche 2 servizi remoti che richiedono l'autenticazione tramite l'accesso al metodo (nome utente, password). Il metodo restituisce un token di sicurezza che mi consente di richiamare un altro metodo, vale a dire che dovrei passare il token di sicurezza ai metodi di servizio come primo argomento.
Quindi mi piacerebbe ottenere questi token di sicurezza immediatamente dopo aver effettuato correttamente l'accesso utilizzando LDAP e memorizzarli in SecurityContext. Ho provato a utilizzare autenticazione-successo-gestore-ref di modulo login elemento. Utilizzo del gestore Sostituisco l'oggetto Authentication in SecurityContext con l'AuthenticationToken personalizzato che contiene non solo password ma anche token di sicurezza. Ma in questo caso ho un'eccezione che nessun provider di autenticazione supporta questa classe di token. So che è anche possibile memorizzare token nella sessione HTTP, ma in questo caso devo passare la sessione all'oggetto servizio, quindi mi piacerebbe memorizzare i token in SecurityContext.Come memorizzare informazioni personalizzate in SecurityContext di Spring Security?

Qual è l'approccio migliore per gestire il token di sicurezza del servizio?

risposta

10

Io uso spesso l'oggetto Authentication.getDetails() per memorizzare informazioni aggiuntive che possono non essere direttamente collegato per l'utente per dire. Quindi è possibile memorizzare qualsiasi oggetto desiderato in quel campo (ad esempio una HashMap) e condivide il ciclo di vita dell'oggetto Authentication.

HashMap<String, Object> info = new HashMap<String, Object>(); 
info.put("extraInfo", "info"); 
auth.setDetails(info); 
... 
Map<String, Object> i = (Map<String, Object>)SecurityContextHolder.getContext().getAuthentication.getDetails(); 
4

L'implementazione di "UserDetails" può contenere dati aggiuntivi. Questo è ciò che viene memorizzato nel SecurityContext, che è successivamente accessibile dopo il login riuscito.

In seguito è possibile accedervi come (si presume MyUserDetails implementa UserDetails)

Object principal = SecurityContextHolder.getContext().getAuthentication(); 
if (principal instanceof MyUserDetails) { 
    MyUserDetails mud = (MyUserDetails) principal; 
    mud.getMyData(); //Extract your additional data here 
} 
+0

Non sono sicuro di poter utilizzare userDetailsSerivce con l'autenticazione LDAP. – viator

+1

Non è necessario implementare l'intero UserDetailsService. Puoi utilizzare la tua implementazione di UserDetails solo con LDAP. Ecco le informazioni su come farlo: http://static.springsource.org/spring-security/site/docs/3.1.x/reference/ldap.html#ldap-custom-user-details – Gopi

Problemi correlati