2011-08-24 5 views
8

In SpringSecurity ha un nome di classe SecurityContextHolder e le sue specifiche: 'Associa un determinato SecurityContext al thread di esecuzione corrente.' Con l'applicazione web ogni volta che arriva una richiesta al server, Spring ricarica anche e imposta SecurityContext di quella richiesta in SecurityContextHolder per il suo thread?In che modo Spring Security gestisce SecurityContext in un thread attraverso le richieste di applicazioni Web?

+0

Vedere http://stackoverflow.com/questions/6408007/spring-securitys-securitycontextholder-session-or-request-bound – Ritesh

risposta

7

Con l'applicazione Web ogni volta che arriva una richiesta al server, Spring ricarica anche e imposta SecurityContext di quella richiesta in SecurityContextHolder per il thread?

Fondamentalmente sì.

Il comportamento predefinito di SecurityContextHolder.getInstance() consiste nel restituire un'istanza SecurityContextHolder memorizzata come thread-local del thread corrente. (Questo è solo il meccanismo di default. È possibile utilizzare una strategia diversa per la localizzazione del SecurityContextHolder chiamando SecurityContextHolder.setStrategemName())

A filtri SpringSecurity assicurano che del richiesta di SecurityContextHolder (comunque si trova) viene caricato con le credenziali di richiesta all'inizio e che il titolare sia liberato al termine dell'elaborazione della richiesta.

+0

Elaborare, la chiave è che il filtro appare nella attribuisce l'invocazione remota per la sicurezza contesto. Solo se un contesto di sicurezza si trova negli attributi di chiamata remota può essere impostato in SecurityContextHolder. Questo contesto di sicurezza viene generalmente fornito dal client con un filtro simile che elabora la chiamata in uscita e inserisce il contesto di sicurezza dal thread locale al richiamo remoto. – Zach

+0

[Perché non funziona] (https://github.com/spring-projects/spring-security/issues/3919) per me? Vedi [StackOverflow Question] (http://stackoverflow.com/questions/34273755/why-is-the-authentication-object-of-the-securitycontext-not-shared-across-thread). – displayname

9

Sì, lo SecurityContextPersistenceFilter si occupa di questo. Per impostazione predefinita, individua il SecurityContext nella HttpSession e lo associa al thread tramite SecurityContextHolder. Al termine dell'elaborazione, la procedura esegue il contrario: prende SecurityContext dal thread e lo inserisce nella sessione.

Dal Javadoc:

popola il SecurityContextHolder con informazioni ottenute dal configurato SecurityContextRepository prima della richiesta e memorizza nuovamente nel repository una volta che la richiesta è stata completata e compensazione titolare contesto. Per impostazione predefinita utilizza un HttpSessionSecurityContextRepository .

+0

Non dovrebbe farlo diventare thread-safe? Sembra che 'SecurityContext' non sia condiviso tra thread nella mia applicazione ([link] (http://stackoverflow.com/questions/34273755/why-is-the-authentication-object-of-the-securitycontext-non -shared-across-thread)). – displayname