Konfiguracja modelu bezpieczeństwa w aplikacjach webowych napisanych w Springu
odbywa się z wykorzystaniem projektu
Spring Security.
W ramach tego projektu dostajemy szereg klas i interfejsów, które wymagają
od nas dostarczenia odpowiedniej konfiguracji.
Najczęściej tworzymy więc klasę oznaczoną przynajmniej dwiema adnotacjami —
@EnableWebSecurity i
@Configuration.
Dodatkowo klasa ta dziedziczy zwykle z klasy abstrakcyjnej
WebSecurityConfigurerAdapter,
w wyniku czego jesteśmy zobowiązani do zaimplementowania metody
configure.
W ten sposób możemy skonfigurować podstawowe elementy bezpieczeństwa, takie jak obsługa akcji poprawnego i błędnego logowania,
czy też uprawnienia do konkretnych ścieżek w aplikacji.
A teraz uwaga...tak to wszystko wyglądało jeszcze do niedawna.
Spring Security 5.7.0-M2
Wersja Spring Security 5.7.0-M2 (pojawiła się w lutym) wprowadza dość istotną modyfikację,
która wpłynie na konfigurację security w wielu projektach.
Okazuje się, że od tej wersji klasa
WebSecurityConfigurerAdapter
została opisana adnotacją
@Deprecated,
co oznacza, że jest przestarzała i planowane jest jej usunięcie w niedalekiej przyszłości.
Tym samym razem z nią wylatuje regularnie nadpisywana metoda
configure.
Bean na ratunek
Na szczęście równolegle otrzymujemy nowe rozwiązanie, które jest zbliżone do poprzedniego,
ale nie wymaga od nas dziedziczenia z predefiniowanej klasy.
Od teraz konfiguracja security opiera się na tworzeniu beanów.
Zobaczmy, jak to wygląda na przykładzie klasy konfiguracyjnej
aplikacji webowej z naszego kursu.
W poniższym kodzie klasy
SecurityConfig widać najważniejsze
elementy z konfiguracją "po nowemu":
Widać tutaj dokładnie, że zmianie ulegają tylko trzy elementy.
Przede wszystkim rzuca się w oczy usunięcie rozszerzenia
WebSecurityConfigurerAdapter.
Następnie widać, że przenosimy zawartość nadpisywanej metody
configure
do nowej metody, z tą różnicą, że na końcu zwracamy budowany obiekt typu
SecurityFilterChain.
Zamiast wstrzykiwania
AuthenticationManagerBuilder do metody
configAuthentication
wstrzykujemy
HttpSecurity i to ten obiekt udostępnia
AuthenticationManagerBuilder,
na bazie którego budujemy obiekt interfejsu
AuthenticationManager. Wszystkie konfiguracje (np.
data source) tworzymy jak wcześniej.
Co z UserDetailsService?
W powyższym przykładzie dane podane w trakcie logowania weryfikujemy z tymi zapisanymi w bazie poprzez
jdbc.
Co jednak gdybyśmy chcieli użyć tutaj klasy
UserDetailsService w celu pobrania danych przy pomocy Spring Data JPA?
Załóżmy, że do tego chcemy również użyć własnego providera uwierzytelnienia:
Tak zbudowana konfiguracja jest również dosyć często spotykana w projektach,
między innymi w naszym
security-app.
W takich projektach zamiast poniższej konfiguracji w
SecurityConfig:
wystarczy napisać metodę tworzącą bean-a
authManager w następujący sposób:
Jak widać, tworzymy tutaj obiekt własnego providera i ustawiamy w nim wymagane zależności,
wśród których znajduje się
userDetailsService wstrzyknięty wcześniej do
klasy
SecurityConfig. Finalnie całego providera wrzucamy do
AuthenticationManagerBuilder pobranego bezpośrednio z obiektu security.
Dołącz do grupy, w której znajdziesz ciekawe posty oraz poznasz odpowiedzi na swoje pytania!
-
Regularnie publikowane posty dotyczące, Springa i Hibernate'a oraz samej Javy.
-
Możliwość zadawania pytań osobom tworzącym społeczność budowaną
wokół tych samych zainteresowań
-
Bezpośredni kontakt z autorem portalu i kursów Javappa!
-
Wymiana doświadczeń między członkami grupy
-
Przyjazna atmosfera w zamkniętej grupie
Appa Notka.
Zajrzyj do naszego Kursu Aplikacji Web - Mega pakiet.
Pierwszy w polskim internecie tak rozbudowany kurs tworzenia aplikacji webowej w Springu na podstawie
gotowej aplikacji, którą ściągniesz na swój komputer.
Implementacja krok po kroku, drogowskazy do miejsc, w których uzupełnisz wiedzę
teoretyczną, a także inne pomocne rozwiązania.
Podsumowanie
Tym samym zarówno w przypadku prostej konfiguracji opartej o uwierzytelnienie zapytaniem
jdbc, jak i
w przypadku konfiguracji powiązanej z dodatkowym serwisem
UserDetailsService,
możemy łatwo wdrożyć nowe rozwiązania i nie musimy przejmować się tym, że klasa
WebSecurityConfigurerAdapter
została przeznaczona do usunięcia.
Autor: Jarek Klimas
Data: 08 października 2022
Labele:Backend, Poziom średniozaawansowany, Java
Masz pytanie odnośnie zagadnienia omawianego w artykule?
Coś, co napisaliśmy, nie zaspokoiło Twojego głodu wiedzy?

Daj nam znać co myślisz i skomentuj artykuł na facebooku!