2013-02-12 7 views
11
  1. Quali sono i vantaggi per ottenere principale come parametro Principal principal controller primavera e poi passarlo al livello di servizio nel corso ricevendo principale nel livello di servizio immediatamente se SecurityContextHolder.getContext().getAuthentication().getPrincipal()?
  2. Qual è l'approccio migliore per ottenere i dettagli principali nel livello di servizio senza controllare gli oggetti getAuthentication() e getPrincipal() per null ovunque (qualcosa come un wrapper personalizzato)?
+1

È possibile trovare le risposte a [questa domanda] (http://stackoverflow.com/questions/248562/when-using-spring-security-what-is-the-proper-way-to-obtain- current-username-i) utile. [Questa risposta] (http://stackoverflow.com/questions/8764545/best-practice-for-getting-active-users-userdetails/8765597#8765597) potrebbe essere utile anche. –

+0

È una buona soluzione avere una classe astratta con metodo statico dove posso mettere 'SecurityContextHolder.getContext(). GetAuthentication(). GetPrincipal()'? Dopo di che posso usarlo nel livello di servizio. – Alex

+0

Leggi il secondo link che ti ho dato di nuovo. Non c'è niente che ti impedisca di utilizzare questo approccio nei tuoi servizi e se utilizzi un'interfaccia puoi anche sostituirla per i test. –

risposta

9
    • tuo API del servizio sarà più facile da usare. Vedrai direttamente la dipendenza dall'entità, quindi non invocherai alcuni metodi di servizio per errore in un ambiente in cui il principal non esiste.
    • In generale meno dipendenze sul codice SpringSecurity significa meno problemi in caso di migrazione alla nuova versione di Spring Security.
    • Sarà possibile riutilizzare il livello di servizio in un ambiente in cui Spring Security non esiste.
  1. Preparare una classe wrapper (ad esempio AuthenticationService). Aggiungi il metodo getPrincipal() ad esso. Implementa i tuoi assegni. Inject AuthenticationService ovunque insted di chiamate dirette a SecurityContextHolder.
+0

Se ho bisogno di ottenere alcuni dati per un utente specifico, penso che ottenere un principal (nome utente per esempio) nel livello di servizio sia più sicuro perché ci sono meno livelli tra questa (restrizione) e il database. Quindi è il solo dao rimasto invece di ottenere il principal nel controller (livello di servizio aggiuntivo tra). Ma d'altra parte, come hai detto, il livello di servizio può essere più riutilizzabile. Cosa ne pensi di questo? – Alex

+1

Un oggetto principale è trattenuto e mantenuto dal livello Web. Quindi per me sembra naturale che un principio provenisse dal contoller al livello di servizio. Un altro punto è che le dipendenze statiche sono dannose per i test unitari: http://misko.hevery.com/2008/12/15/static-methods-are-death-to-estibility/. Non vedo alcun problema di sicurezza perché un'istanza principale è immutabile (e in questo momento la password verrà modificata in base all'effettiva implementazione). Scusa il ritardo. Ero AFK da molto tempo. –

+0

È sicuro utilizzare l'opzione 2 nel BaseService esteso (nel livello di servizio)? – Alex

Problemi correlati