Buduję aplikację internetową z Spring Security, która będzie działać na Amazon EC2 i używać elastycznych równoważników obciążenia Amazon. Niestety ELB nie obsługuje sesji sticky, więc muszę upewnić się, że moja aplikacja działa poprawnie bez sesji.
Do tej pory skonfigurowałem RememberMeServices, aby przypisywać token za pośrednictwem pliku cookie i działa to dobrze, ale chcę, aby plik cookie wygasał wraz z sesją przeglądarki (np. Po zamknięciu przeglądarki).
Muszę sobie wyobrazić, że nie jestem pierwszą osobą, która chce używać Spring Security bez sesji ... jakieś sugestie?
spring
spring-security
load-balancing
amazon-ec2
Jarrod Carlson
źródło
źródło
Wydaje się, że w Spring Securitiy 3.0 jest jeszcze łatwiej. Jeśli używasz konfiguracji przestrzeni nazw, możesz po prostu wykonać następujące czynności:
Lub można skonfigurować SecurityContextRepository za nieważną, a nic by kiedykolwiek zostaną zapisane w ten sposób , jak również .
źródło
Pracowaliśmy nad tym samym problemem (wstrzykiwanie niestandardowego SecurityContextRepository do SecurityContextPersistenceFilter) przez 4-5 godzin dzisiaj. W końcu to wymyśliliśmy. Przede wszystkim w sekcji 8.3 Spring Security ref. doc, istnieje definicja fasoli SecurityContextPersistenceFilter
Po tej definicji znajduje się wyjaśnienie: „Alternatywnie można podać pustą implementację interfejsu SecurityContextRepository, która uniemożliwi przechowywanie kontekstu zabezpieczeń, nawet jeśli sesja została już utworzona podczas żądania”.
Musieliśmy wstrzyknąć nasze niestandardowe SecurityContextRepository do SecurityContextPersistenceFilter. Więc po prostu zmieniliśmy powyższą definicję fasoli za pomocą naszego niestandardowego pliku impl i umieściliśmy go w kontekście bezpieczeństwa.
Kiedy uruchomiliśmy aplikację, prześledziliśmy dzienniki i zobaczyliśmy, że SecurityContextPersistenceFilter nie korzystał z naszego niestandardowego impl, tylko z HttpSessionSecurityContextRepository.
Po kilku innych próbach stwierdziliśmy, że musimy nadać naszemu niestandardowemu plikowi impl SecurityContextRepository atrybut „security-context-repository-ref” przestrzeni nazw „http”. Jeśli używasz przestrzeni nazw „http” i chcesz wprowadzić własny plik SecurityContextRepository impl, wypróbuj atrybut „security-context-repository-ref”.
Gdy używana jest przestrzeń nazw „http”, oddzielna definicja SecurityContextPersistenceFilter jest ignorowana. Jak skopiowałem powyżej, dokument referencyjny. nie stwierdza tego.
Proszę, popraw mnie, jeśli źle zrozumiałem.
źródło
Spójrz na
SecurityContextPersistenceFilter
klasę. Określa, w jaki sposóbSecurityContextHolder
jest wypełniony. Domyślnie używaHttpSessionSecurityContextRepository
do przechowywania kontekstu bezpieczeństwa w sesji http.Zaimplementowałem ten mechanizm dość łatwo, z niestandardowym
SecurityContextRepository
.Zobacz
securityContext.xml
poniżej:źródło
Właściwie
create-session="never"
nie oznacza to bycia całkowicie bezpaństwowcem. Jest to problem dla że w zarządzaniu emisyjnej Wiosna Bezpieczeństwa.źródło
Po zmaganiach z licznymi rozwiązaniami zamieszczonymi w tej odpowiedzi, aby spróbować uzyskać coś działającego podczas korzystania z
<http>
konfiguracji przestrzeni nazw, w końcu znalazłem podejście, które faktycznie działa w moim przypadku użycia. Właściwie nie wymagam, żeby Spring Security nie rozpoczynał sesji (ponieważ używam sesji w innych częściach aplikacji), tylko żeby w ogóle nie "pamiętał" uwierzytelnienia w sesji (powinno być ponownie sprawdzone każde żądanie).Przede wszystkim nie byłem w stanie dowiedzieć się, jak wykonać technikę „implementacji zerowej” opisaną powyżej. Nie było jasne, czy masz ustawić securityContextRepository
null
na implementację bez operacji . Ten pierwszy nie działa, ponieważNullPointerException
zostaje wrzucony do środkaSecurityContextPersistenceFilter.doFilter()
. Jeśli chodzi o implementację no-op, próbowałem zaimplementować ją w najprostszy sposób, jaki mogłem sobie wyobrazić:To nie działa w mojej aplikacji z powodu dziwnego
ClassCastException
związku zresponse_
typem.Nawet zakładając, że udało mi się znaleźć implementację, która działa (po prostu nie przechowując kontekstu w sesji), nadal istnieje problem, jak wstrzyknąć ją do filtrów zbudowanych przez
<http>
konfigurację. Nie można po prostu wymienić filtra naSECURITY_CONTEXT_FILTER
miejscu, zgodnie z dokumentacją . Jedynym sposobem, w jaki znalazłem zaczepienie w tym,SecurityContextPersistenceFilter
co powstaje pod okładkami, było napisanie brzydkiejApplicationContextAware
fasoli:W każdym razie do rozwiązania, które faktycznie działa, choć jest bardzo hakerskie. Po prostu użyj a,
Filter
który usuwa wpis sesji, któregoHttpSessionSecurityContextRepository
szuka, gdy robi swoje:Następnie w konfiguracji:
źródło
WebSecurityConfigurerAdapter
z „http.addFilterBefore(new SpringSecuritySessionDeletingFilter(), SecurityContextPersistenceFilter.class)
”Krótka uwaga: jest to „tworzenie sesji”, a nie „tworzenie sesji”
tworzenie sesji
Kontroluje zapał, z jakim tworzona jest sesja HTTP.
Jeśli nie jest ustawione, przyjmuje wartość domyślną „ifRequired”. Inne opcje to „zawsze” i „nigdy”.
Ustawienie tego atrybutu wpływa na właściwości allowSessionCreation i forceEagerSessionCreation HttpSessionContextIntegrationFilter. allowSessionCreation zawsze będzie mieć wartość true, chyba że ten atrybut ma wartość „never”. forceEagerSessionCreation ma wartość „false”, chyba że jest ustawiona na „always”.
Zatem domyślna konfiguracja umożliwia tworzenie sesji, ale nie wymusza tego. Wyjątkiem jest sytuacja, w której kontrola sesji współbieżnej jest włączona, gdy forceEagerSessionCreation zostanie ustawiona na true, niezależnie od tego, jakie jest tutaj ustawienie. Użycie „never” spowodowałoby wówczas wyjątek podczas inicjowania HttpSessionContextIntegrationFilter.
Szczegółowe informacje na temat użycia sesji można znaleźć w dobrej dokumentacji w pliku javadoc HttpSessionSecurityContextRepository.
źródło
auto-config=false
najwyraźniej nie możesz zastąpić tego, co jest naSECURITY_CONTEXT_FILTER
miejscu, swoim własnym. Hakowałem wokół, próbując go wyłączyć za pomocą jakiejśApplicationContextAware
fasoli (używając odbicia, aby wymusićsecurityContextRepository
implementację zerowąSessionManagementFilter
), ale bez kości. I niestety nie mogę przejść na zabezpieczenie wiosenne 3,1 roku, które by mi zapewniłocreate-session=stateless
.