2011-08-24 9 views
8

W SpringSecurity ma nazwę klasy SecurityContextHolder i jej specyfikację: "Kojarzy dane SecurityContext z bieżącym wątkiem wykonawczym." Z aplikacją sieciową, gdy żądanie przychodzi do serwera, Spring również przeładowuje i ustawia SecurityContext tego żądania w SecurityContextHolder dla swojego wątku?W jaki sposób Spring Security zarządza SecurityContext w wątku w żądaniach aplikacji WWW?

+0

proszę zobaczyć http://stackoverflow.com/questions/6408007/spring-securitys-securitycontextholder-session-or-request-bound – Ritesh

Odpowiedz

7

Z aplikacją sieciową, gdy żądanie przychodzi do serwera, a następnie Spring również przeładować i ustawić SecurityContext tego żądania w SecurityContextHolder dla swojego wątku?

Zasadniczo tak.

Domyślnym zachowaniem SecurityContextHolder.getInstance() jest zwrócenie instancji SecurityContextHolder, która została zapisana jako lokalny wątek bieżącego wątku. (To jest tylko mechanizm domyślne. Można użyć innej strategii dla lokalizowania SecurityContextHolder wywołując SecurityContextHolder.setStrategemName())

A filtry SpringSecurity upewnić się, że wniosek na SecurityContextHolder (jednak znajduje) jest ładowany z poświadczeniami żądanie na początku i że posiadacz jest rozliczany na koniec przetwarzania wniosku.

+0

opracowanie, kluczem jest to, że filtr wygląda w atrybuty zdalnego wywołania dla bezpieczeństwa kontekst. Tylko jeśli kontekst bezpieczeństwa jest w zdalnych atrybutach wywołania, można go ustawić w SecurityContextHolder. Ten kontekst zabezpieczeń jest zwykle dostarczany z klienta za pomocą podobnego filtru, który przetwarza wychodzące wywołanie i umieszcza kontekst zabezpieczeń z wątku lokalnego na zdalne wywołanie. – Zach

+0

[Dlaczego to nie działa] (https://github.com/spring-projects/spring-security/issues/3919) dla mnie? Zobacz pytanie [stackoverflow] (http://stackoverflow.com/questions/34273755/why-is-the-authentication-object-the-securitycontext-not-shared-across-thread). – displayname

9

Tak, zajmuje się tym . Domyślnie lokalizuje SecurityContext w HttpSession i wiąże go z wątkiem za pomocą SecurityContextHolder. Po zakończeniu przetwarzania żądania wykonuje odwrotność - pobiera element SecurityContext z wątku i umieszcza go w sesji.

Z Javadoc:

Zapełnia SecurityContextHolder z informacji uzyskanych od skonfigurowany SecurityContextRepository przed życzenie i sklepach go z powrotem w repozytorium raz wniosek został wypełniony i wyczyszczenie posiadacza kontekst. Domyślnie używa on HttpSessionSecurityContextRepository.

+0

Czy nie powinno to również powodować, że wątek będzie bezpieczny? Wygląda na to, że "SecurityContext" nie jest współdzielony przez wątki w mojej aplikacji ([link] (http://stackoverflow.com/questions/34273755/why-is-the-authentication-object-the-securitycontext-not -shared-across-thread)). – displayname

Powiązane problemy