2016-05-28 11 views
8

Sono davvero nuovo per Spring e Spring Security. Stavo leggendo su Spring Security ed è uscito il concetto di principal, che dovrebbe essere l'utente registrato corrente. Ma cosa succede se abbiamo più di un utente registrato corrente? Quindi, la mia domanda è, qual è esattamente il principale nella sicurezza di primavera?Qual è il "principale" in Spring Security?

Ho letto ad esempio questo tutorial:

http://www.mkyong.com/spring-security/get-current-logged-in-username-in-spring-security/

e sembrano tener conto che c'è solo una corrente registrato utente, che spesso non è il caso.

Come si recupera un utente specifico? E come faccio a distinguere tra gli utenti che stanno facendo richieste?

+0

http://stackoverflow.com/questions/4989063/what-is-the-mash-of-subject-vs-user-vs-principal-in-a-security-context - non è una cosa specifica della primavera . – zapl

risposta

19

Il principale è l'utente attualmente connesso. Tuttavia, lo si recupera attraverso il contesto di sicurezza che è legato al thread corrente e come tale è anche associato alla richiesta corrente e alla sua sessione.

SecurityContextHolder.getContext() ottiene internamente l'attuale implementazione SecurityContext tramite una variabile ThreadLocal. Poiché una richiesta è associata a un singolo thread, questo ti darà il contesto della richiesta corrente.

Per semplificare si potrebbe dire che il contesto di sicurezza è nella sessione e contiene utente/principale e ruoli/autorità.

Come si recupera un utente specifico?

Non è così. Tutte le API sono progettate per consentire l'accesso alla sessione utente & della richiesta corrente. Consenti all'utente A di essere uno dei 100 utenti attualmente autenticati. Se A emette una richiesta contro il server, allocherà un thread per elaborare quella richiesta. Se fai quindi SecurityContextHolder.getContext().getAuthentication() lo fai nel contesto di questo thread. Per impostazione predefinita all'interno di quel thread non si ha accesso al contesto dell'utente B che viene elaborato da un thread diverso.

E come faccio a distinguere tra utenti che stanno facendo richieste?

Non è necessario, è ciò che fa il contenitore Servlet per te.

+0

Quindi, la mia domanda conseguente è: come si differenzia la primavera tra le sessioni e gli utenti? Immagino che ciò richieda una comprensione più approfondita di Spring ... – nbro

+0

Grazie! Bella risposta. Ho solo un dubbio che deriva dalla mia ridotta esperienza nella creazione di applicazioni web, ecc. Ma prima fammi provare a spiegare quello che penso di sapere. Da quello che ho imparato, le richieste HTTP possono essere migliorate con un ID di sessione. Questa informazione è probabilmente utilizzata da Tomcat (o altro) per distinguere tra utenti e richieste. Principale è l'utente attualmente connesso per il contesto corrente. Per capire che c'è un utente che ha effettuato l'accesso (un principal), probabilmente deve essere associato a un numero di sessione. – nbro

+0

Supponiamo ora che io abbia due utenti loggati chiamati 'root' e' admin' e che abbia un controller il cui mapping delle richieste sia '/ users/{username}'. Supponiamo inoltre che 'root' stia giocando con il suo account sul lato client all'URL' www.host.com: 3000/users/root'. A questo punto, suppongo che un ID sessione sia già stato generato per root. Se ora prova a fare una richiesta a 'www.host.com: 3000/users/admin', cambiando ad esempio l'URL manualmente, e anche admin è connesso e connesso da un'altra macchina, cosa accadrebbe in questo caso ? – nbro