Asigurați-vă securitatea aplicației dvs. Spring utilizând caracteristicile robuste oferite de cadrul Spring Security.
Cadrul Spring Security vă securizează aplicația prin autentificare și autorizare. În starea sa implicită, Spring Security asigură că fiecare cale de solicitare HTTP (sau pagină) din aplicația dvs. necesită autentificarea unui singur utilizator global.
Acest cadru este, de asemenea, extrem de flexibil. Vă permite să creați reguli de securitate personalizate pentru fiecare cale de solicitare HTTP din aplicația dvs., precum și pentru diferiții utilizatori. Deci, puteți elimina restricția de securitate pe paginile care nu necesită autorizarea utilizatorului (cum ar fi o pagină de pornire). Și setați rolurile și autoritățile anumitor tipuri de utilizatori.
Adăugarea Spring Security la aplicația dvs
Există două moduri de a adăuga Spring Security la aplicația dvs. Puteți fie să-l selectați ca dependență atunci când generați o nouă aplicație Spring Boot folosind Spring initializr, sau adăugați-l în fișierul de specificații de construcție în secțiunea de dependență după generarea proiectului.
Dacă ați selectat una dintre opțiunile proiectului Gradle, atunci fișierul de dependențe este construi.gradle. Cu toate acestea, dacă ați ales Maven, atunci acel fișier este pom.xml.
Ta construi.gradle fișierul ar trebui să conțină următoarea dependență:
dependencies {
implementation 'org.springframework.boot: spring-boot-starter-security'
}
În timp ce pom.xml fișierul ar trebui să conțină următoarea dependență:
org.springframework.boot
spring-boot-starter-security
Exemplul de aplicație folosit în articol este disponibil în acest articol Depozitul GitHub și este gratuit pentru utilizare sub licența MIT.
Folosind Spring Security
Odată ce adăugați dependența Spring Security în aplicația dvs., puteți începe să utilizați cadrul imediat. Pur și simplu executați aplicația, apoi navigați la pagina de pornire a Spring Boot (sau la orice pagină din aplicația dvs.). Aplicația exemplu utilizează următorul controler inițial pentru a controla valoarea implicită a Spring Boot gazdă locală: 8080 cerere:
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!";
}
}
Executarea aplicației după adăugarea unei singure clase de controler de mai sus generează următoarea vizualizare inițială:
Veți observa că vă direcționează automat către localhost: 8080/login și face acest lucru înainte de a vă permite să accesați orice altă pagină a aplicației. În această etapă, va trebui să furnizați numele de utilizator implicit (care este utilizatorul) și parola generată automat (pe care o veți găsi în consolă). Consola va genera o linie ca următoarea:
Using generated security password: c4070465-4c65-4e72-8c3f-3800e631ba81
De fiecare dată când reporniți aplicația, parola generată automat se va schimba, dar numele de utilizator va rămâne același. Introducerea numelui de utilizator și a parolei implicite vă va direcționa către vizualizarea corespunzătoare din aplicație.
Personalizarea Spring Security
Pentru a personaliza securitatea aplicației, va trebui să înlocuiți configurația implicită a Spring Security. Dar înainte de asta (presupunând că aveți deja Spring Web), veți avea nevoie de câteva alte dependențe pentru această aplicație exemplu:
- Spring Data JPA
- Driver MySQL JDBC
- Frunza de cimbrișor
- Lombok
Cadrul Thymeleaf va genera vederi diferite. Lombok va ajuta la reducerea codului din clasele dvs. de obiecte. Biblioteca JPA și driverul MySQL vă vor permite să utilizați o bază de date MySQL cu aplicația, dar aveți opțiunea de a utiliza orice bază de date cu care vă simțiți confortabil. Utilizarea unei baze de date înseamnă configurarea aplicaţii.proprietăţi fișier sub fișierul de resurse.
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
Codul de configurare de mai sus vă permite să vă conectați la o bază de date MySQL locală numită primavara_securitate, cu un nume de utilizator de rădăcină, și parola (1234). Va trebui să actualizați aceste date pentru a se potrivi cu numele și acreditările bazei de date.
După ce ați adăugat dependențe suplimentare și ați creat baza de date, puteți începe să decideți câte vizualizări va avea aplicația dvs. De asemenea, va trebui să știți cum arată securitatea pentru fiecare pagină. Aplicația noastră eșantion are 6 vizualizări:
- Pagina principala
- Pagina de înregistrare
- Pagina de logare
- Pagina de deconectare
- Pagina de utilizator
- Pagina de eroare
Singura vizualizare care va necesita autorizarea utilizatorului este pagina de utilizator. Această pagină este accesibilă numai utilizatorilor care se înregistrează mai întâi, apoi se conectează la aplicație. Pe lângă pachetul implicit al Spring Boot, va trebui să creați alte patru pachete în aplicația dvs.
Clasa de controlor de înregistrare
Pachetul controlerului va conține clasele care gestionează cererile HTTP. În funcție de funcția unei pagini, de obicei puteți grupa fiecare cerere HTTP într-o clasă de controler, așa cum este cazul WebController clasă. Cu toate acestea, vizualizarea de înregistrare are mai multe funcții unice, astfel încât poate avea o clasă de controler privat:
@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 Controller de înregistrare clasa este o poartă către aspectul de securitate al aplicației dvs. The @RequestMapping adnotarea specifică tipul de solicitare pe care acest controlor o va gestiona (cererile către localhost: 8080/registru).
The @GetMapping adnotarea indică pur și simplu că, dacă aplicația primește o cerere pentru /register, cel formular de înregistrare() metoda ar trebui să gestioneze acea solicitare, returnând vizualizarea de înregistrare.
După ce un vizitator face clic pe butonul de înregistrare, apoi pe @PostMapping adnotarea intră în joc. The procesÎnregistrare() metoda vă permite să postați datele utilizatorului pe care le primește de la Formular de înregistrare clasa la baza de date, folosind UserRepository clasă. Dar înainte de a stoca aceste date, procesÎnregistrare() metoda criptează parola utilizatorului folosind De primăvarăPasswordEncoder interfata.
Crearea de noi configurații de securitate
Începând cu Spring 3.1, dezvoltatorii pot crea acum configurații pentru Spring Security folosind Java, ceea ce înseamnă clase în loc de XML. Principalul lucru pe care îl necesită aceste clase de configurare este @Configurare adnotare.
@Configuration
publicclassSecurityConfiguration{
}
The @Configurare adnotarea indică faptul că clasa de mai sus este o clasă de configurare. Aceste clase oferă fasole pentru Contextul de aplicare de primăvară, care este un container pe care Spring îl folosește pentru a crea și gestiona diferitele componente (sau fasole) ale unei aplicații. Prima fasole din Configurare securitate clasa este passwordEncoder fasole.
@Bean
public PasswordEncoder passwordEncoder(){
returnnew BCryptPasswordEncoder();
}
The Controller de înregistrare clasa foloseste passwordEncoder bean pentru a codifica parole noi înainte de a le salva în baza de date. Un alt bob important pe care va trebui să îl adăugați la Configurare securitate clasa este userDetailsService fasole.
@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 userDetailsService fasole angajează Securitatea de primăvarăUserDetailsService interfață pentru a prelua numele de utilizator și parola unui utilizator pentru autentificare, în timpul sesiunii de conectare a unui client. Așadar, de îndată ce un client face clic pe butonul de conectare din vizualizarea de conectare, acesta userDetailsService fasolea se pune în mișcare.
Prin UserRepository, cel userDetailsService bean obține acces la toți clienții existenți în baza de date. Această interfață folosește apoi UserRepository pentru a localiza un utilizator cu un nume de utilizator și o parolă care se potrivesc, apoi returnează toate atributele acestui client ca obiect.
Dacă obiectul returnat este un client, atunci acest client obține acces la aplicație. În caz contrar, pagina se va reîmprospăta automat, permițând utilizatorului să introducă acreditări valide.
Lanțul de filtrare
Securitatea de primăvarăSecurityFilterChain interfața este utilă interfață de programare a aplicațiilor (API) care joacă un rol esențial în configurația Spring Security. Această interfață funcționează cu Securitatea de primăvarăHttpSecurity clasă pentru a crea un lanț de filtre pentru anumite solicitări 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 filterChain fasolea de mai sus folosește SecurityFilterChain API pentru a îndeplini mai multe sarcini. În primul rând, folosește HttpSecurity clasă pentru a dicta că numai utilizatorii care au rolul de UTILIZATOR pot accesa localhost: 8080/utilizator. Și un utilizator primește acest rol după înregistrare, datorită getAuthorities() metoda pe care o implementează fiecare nou obiect client.
@Override
public Collection extends="extends" grantedauthority="grantedauthority"?> getAuthorities() {
return Arrays.asList(new SimpleGrantedAuthority("USER"));
}
Lanțul de filtre permite accesul neautentificat la toate celelalte adrese URL din aplicație. The filterChain fasolea folosește și formLogin() și deconectare() metode ale HttpSecurity obiect de clasă.
Aceste metode vă permit să direcționați automat un utilizator către anumite pagini după ce efectuează o sarcină. Deci, un utilizator care introduce acreditările corecte și face clic pe butonul de conectare de pe /login pagina va fi direcționată automat către /user pagină.
În cele din urmă, cel filterChain bean construiește și returnează lanțul de filtre, care permite utilizatorilor autorizați să acceseze aplicația. Toate cele trei fasole din Configurare securitate clasă lucrează împreună pentru a vă asigura aplicația.
Însă filterChain bean joacă rolul mai semnificativ de a dicta nivelul de autorizare pt fiecare cerere HTTP. Pe măsură ce începeți să adăugați mai multe pagini în aplicația dvs., puteți utiliza filterChain bean pentru a-și stabili nivelul de securitate.
Beneficiul major al securității de primăvară
Spring Security vă oferă control complet nu numai asupra cine are acces la aplicația dvs., ci și asupra tipului de acces pe care îl poate avea un utilizator (prin caracteristica rolurilor de utilizator). Controlul accesului este unul dintre cele mai importante aspecte ale oricărei aplicații. Oferirea utilizatorilor generali de acces nefiltrat la aplicația dvs. din cauza barierelor limitate de control al accesului s-ar putea dovedi a fi o greșeală costisitoare.