Zapewnij bezpieczeństwo swojej aplikacji Spring, wykorzystując solidne funkcje oferowane przez platformę Spring Security.
Platforma Spring Security zabezpiecza Twoją aplikację poprzez uwierzytelnianie i autoryzację. W stanie domyślnym Spring Security zapewnia, że każda ścieżka żądania HTTP (lub strona) w Twojej aplikacji wymaga uwierzytelnienia pojedynczego użytkownika globalnego.
Ramy te są również niezwykle elastyczne. Pozwala tworzyć niestandardowe reguły bezpieczeństwa dla każdej ścieżki żądania HTTP w aplikacji, a także dla różnych użytkowników. Możesz więc usunąć ograniczenie bezpieczeństwa na stronach, które nie wymagają autoryzacji użytkownika (takich jak strona główna). I ustaw role i uprawnienia określonych typów użytkowników.
Dodanie zabezpieczeń Spring do Twojej aplikacji
Istnieją dwa sposoby dodania Spring Security do Twojej aplikacji. Możesz wybrać ją jako zależność podczas generowania nowej aplikacji Spring Boot za pomocą inicjalizacji Springalub dodaj go do pliku specyfikacji kompilacji w sekcji zależności po wygenerowaniu projektu.
Jeśli wybrałeś jedną z opcji projektu Gradle, plik zależności jest poziom kompilacji. Jeśli jednak wybierzesz Mavena, to ten plik jest pom.xml.
Twój poziom kompilacji plik powinien zawierać następującą zależność:
dependencies {
implementation 'org.springframework.boot: spring-boot-starter-security'
}
Podczas gdy twój strom.xml plik powinien zawierać następującą zależność:
org.springframework.boot
spring-boot-starter-security
Przykładowa aplikacja użyta w artykule jest dostępna w this Repozytorium GitHub i jest darmowy do użytku na licencji MIT.
Korzystanie z zabezpieczeń sprężynowych
Po dodaniu zależności Spring Security do swojej aplikacji możesz od razu zacząć korzystać z frameworka. Po prostu uruchom aplikację, a następnie przejdź do strony głównej Spring Boot (lub dowolnej strony w aplikacji). Przykładowa aplikacja używa następującego kontrolera początkowego do kontrolowania ustawień domyślnych Spring Boot lokalny host: 8080 wniosek:
package com.springSecurityDemo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
publicclassWebController{
@GetMapping("/")
public String home(){
return"Welcome!";
}
}
Wykonanie aplikacji po dodaniu powyższej klasy pojedynczego kontrolera generuje następujący widok początkowy:
Zauważysz, że automatycznie przekieruje Cię do lokalny host: 8080/logowanie stronę i robi to, zanim pozwoli ci uzyskać dostęp do jakiejkolwiek innej strony aplikacji. Na tym etapie musisz podać domyślną nazwę użytkownika (czyli user) oraz automatycznie wygenerowane hasło (które znajdziesz w konsoli). Konsola wygeneruje następującą linię:
Using generated security password: c4070465-4c65-4e72-8c3f-3800e631ba81
Za każdym razem, gdy ponownie uruchomisz aplikację, automatycznie wygenerowane hasło zmieni się, ale nazwa użytkownika pozostanie taka sama. Wprowadzenie domyślnej nazwy użytkownika i hasła przekieruje Cię do odpowiedniego widoku w Twojej aplikacji.
Dostosowywanie zabezpieczeń Springa
Aby dostosować zabezpieczenia aplikacji, musisz zastąpić domyślną konfigurację Spring Security. Ale wcześniej (zakładając, że masz już Spring Web) będziesz potrzebować kilku innych zależności dla tej przykładowej aplikacji:
- WZP danych wiosennych
- Sterownik JDBC MySQL
- Tymianek
- Lombok
Ramy Thymeleaf będą generować różne widoki. Lombok pomoże zredukować kod w twoich klasach obiektów. Biblioteka JPA i sterownik MySQL pozwolą ci używać bazy danych MySQL z aplikacją, ale masz możliwość korzystania z dowolnej bazy danych, z którą czujesz się komfortowo. Korzystanie z bazy danych oznacza konfigurowanie aplikacje.właściwości plik pod plikiem zasobów.
spring.datasource.url=jdbc: mysql://${MYSQL_HOST: localhost}:3306/spring_security
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
Powyższy kod konfiguracyjny umożliwia połączenie z lokalną bazą danych MySQL o nazwie wiosna_bezpieczeństwo, z nazwą użytkownika źródło, i hasło (1234). Musisz zaktualizować te dane, aby były zgodne z nazwą bazy danych i poświadczeniami.
Po dodaniu dodatkowych zależności i utworzeniu bazy danych możesz zacząć decydować, ile widoków będzie miała Twoja aplikacja. Musisz także wiedzieć, jak wygląda bezpieczeństwo każdej strony. Nasza przykładowa aplikacja ma 6 widoków:
- Strona główna
- Strona rejestracji
- Strona logowania
- Strona wylogowania
- Strona użytkownika
- Strona błędu
Jedynym widokiem, który będzie wymagał autoryzacji użytkownika, jest strona użytkownika. Ta strona jest dostępna tylko dla użytkowników, którzy najpierw się zarejestrują, a następnie zalogują do aplikacji. Oprócz domyślnego pakietu Spring Boot musisz utworzyć cztery inne pakiety w swojej aplikacji.
Klasa kontrolera rejestracji
Pakiet kontrolera będzie zawierał klasy obsługujące żądania HTTP. W zależności od funkcji strony zazwyczaj można zgrupować każde żądanie HTTP w jedną klasę kontrolera, tak jak ma to miejsce w przypadku Kontroler sieciowy klasa. Jednak widok rejestracji ma bardziej unikalne funkcje, dlatego może mieć prywatną klasę kontrolera:
@Controller
@RequestMapping("/register")
publicclassRegistrationController{
private UserRepository userRepo;
private PasswordEncoder passwordEncoder;
publicRegistrationController( UserRepository userRepo, PasswordEncoder passwordEncoder){
this.userRepo = userRepo;
this.passwordEncoder = passwordEncoder;
}
@GetMapping
public String registerForm(){
return"registration";
}
@PostMapping
public String processRegistration(RegistrationForm form){
userRepo.save(form.toUser(passwordEncoder));
return"redirect:/login";
}
}
The Kontroler rejestracji class jest bramą do aspektów bezpieczeństwa Twojej aplikacji. The @RequestMapping adnotacja określa typ żądania, które ten kontroler będzie obsługiwał (żądania do lokalny host: 8080/rejestr).
The @GetMapping adnotacja po prostu wskazuje, że jeśli aplikacja otrzyma żądanie /register, formularz rejestracyjny() powinna obsłużyć to żądanie, zwracając widok rejestracji.
Po tym, jak odwiedzający kliknie przycisk rejestracji, a następnie @PostMapping wchodzi w grę adnotacja. The procesRejestracja() Metoda pozwala publikować dane użytkownika, które otrzymuje z Formularz rejestracyjny class do bazy danych, używając Repozytorium użytkowników klasa. Ale zanim zapisze te dane, plik procesRejestracja() Metoda szyfruje hasło użytkownika za pomocą WiosnaPasswordEncoder interfejs.
Tworzenie nowych konfiguracji zabezpieczeń
Od wersji Spring 3.1 programiści mogą teraz tworzyć konfiguracje dla Spring Security przy użyciu Javy, co oznacza klasy zamiast XML. Najważniejszą rzeczą wymaganą przez te klasy konfiguracji jest @Konfiguracja adnotacja.
@Configuration
publicclassSecurityConfiguration{
}
The @Konfiguracja adnotacja wskazuje, że powyższa klasa jest klasą konfiguracji. Te klasy dostarczają komponenty bean do Kontekst aplikacji wiosennej, który jest kontenerem używanym przez Springa do tworzenia i zarządzania różnymi komponentami (lub komponentami bean) aplikacji. Pierwsza fasola w Konfiguracja zabezpieczeń klasa jest koder hasła fasola.
@Bean
public PasswordEncoder passwordEncoder(){
returnnew BCryptPasswordEncoder();
}
The Kontroler rejestracji klasa używa koder hasła bean do kodowania nowych haseł przed zapisaniem ich w bazie danych. Kolejna ważna fasola, którą musisz dodać do Konfiguracja zabezpieczeń klasa jest UżytkownikSzczegółyUsługa fasola.
@Bean
public UserDetailsService userDetailsService(UserRepository userRepo){
return username -> {
Customer customer = userRepo.findByUsername(username);
if (customer != null)
return customer;
thrownew UsernameNotFoundException("Customer '" + username + "' not found");
};
}
The UżytkownikSzczegółyUsługa fasola zatrudnia Wiosenna ochronaSzczegółyUżytkownikaUsługa interfejs do pobierania nazwy użytkownika i hasła w celu uwierzytelnienia podczas sesji logowania klienta. Tak więc, gdy tylko klient kliknie przycisk logowania w widoku logowania, UżytkownikSzczegółyUsługa fasola wprawia w ruch.
Przez Repozytorium użytkowników, UżytkownikSzczegółyUsługa bean uzyskuje dostęp do wszystkich istniejących klientów w bazie danych. Ten interfejs następnie używa Repozytorium użytkowników aby zlokalizować użytkownika z pasującą nazwą użytkownika i hasłem, a następnie zwraca wszystkie atrybuty tego klienta jako obiekt.
Jeśli zwracanym obiektem jest klient, to ten klient uzyskuje dostęp do aplikacji. W przeciwnym razie strona zostanie automatycznie odświeżona, umożliwiając użytkownikowi wprowadzenie prawidłowych poświadczeń.
Łańcuch filtrów
Wiosenna ochronaŁańcuch filtrów bezpieczeństwa interfejs jest przydatny interfejs programowania aplikacji (API) który odgrywa kluczową rolę w konfiguracji Spring Security. Ten interfejs współpracuje z Wiosenna ochronaHttpSecurity class, aby utworzyć łańcuch filtrów dla określonych żądań HTTP.
@Bean
public SecurityFilterChain filterChain(HttpSecurity http)throws Exception {
http
.authorizeHttpRequests((authorize) -> authorize
.requestMatchers("/user").hasAuthority("USER").anyRequest().permitAll())
.formLogin(formLogin -> formLogin
.loginPage("/login").defaultSuccessUrl("/user", true))
.logout(logout -> logout.logoutSuccessUrl("/logout"));
return http.build();
}
The filtrujŁańcuch bean powyżej używa Łańcuch filtrów bezpieczeństwa API do wykonania kilku zadań. Po pierwsze, wykorzystuje tzw HttpSecurity class, aby dyktować, że dostęp mogą mieć tylko użytkownicy, którzy mają rolę UŻYTKOWNIKA lokalny host: 8080/użytkownik. A użytkownik otrzymuje tę rolę po rejestracji, dzięki getAuthorities() metoda, którą implementuje każdy nowy obiekt klienta.
@Override
public Collection extends="extends" grantedauthority="grantedauthority"?> getAuthorities() {
return Arrays.asList(new SimpleGrantedAuthority("USER"));
}
Łańcuch filtrów umożliwia nieuwierzytelniony dostęp do wszystkich innych adresów URL w aplikacji. The filtrujŁańcuch fasola również wykorzystuje formularzZaloguj() I Wyloguj() metody tzw HttpSecurity obiekt klasy.
Metody te umożliwiają automatyczne kierowanie użytkownika na określone strony po wykonaniu przez niego zadania. Tak więc użytkownik, który wprowadzi prawidłowe dane uwierzytelniające i kliknie przycisk logowania na /login strona zostanie automatycznie przekierowana do /user strona.
Wreszcie, filtrujŁańcuch bean buduje i zwraca łańcuch filtrów, który umożliwia autoryzowanym użytkownikom dostęp do aplikacji. Wszystkie trzy fasole w Konfiguracja zabezpieczeń klasa pracuje razem, aby zabezpieczyć twoją aplikację.
Jednakże filtrujŁańcuch bean odgrywa bardziej znaczącą rolę w dyktowaniu poziomu autoryzacji każde żądanie HTTP. Gdy zaczniesz dodawać więcej stron do swojej aplikacji, możesz użyć filtrujŁańcuch bean, aby ustawić ich poziom bezpieczeństwa.
Główna zaleta bezpieczeństwa wiosennego
Spring Security zapewnia pełną kontrolę nie tylko nad tym, kto ma dostęp do Twojej aplikacji, ale także nad rodzajem dostępu, jaki może mieć użytkownik (poprzez funkcję ról użytkownika). Kontrola dostępu jest jednym z najważniejszych aspektów każdej aplikacji. Zapewnienie zwykłym użytkownikom niefiltrowanego dostępu do aplikacji ze względu na ograniczone bariery kontroli dostępu może okazać się kosztownym błędem.