Osigurajte sigurnost svoje Spring aplikacije iskorištavanjem robusnih značajki koje nudi okvir Spring Security.
Spring Security okvir osigurava vašu aplikaciju autentifikacijom i autorizacijom. U svom zadanom stanju, Spring Security osigurava da svaki put HTTP zahtjeva (ili stranica) u vašoj aplikaciji zahtijeva autentifikaciju jednog globalnog korisnika.
Ovaj je okvir također iznimno fleksibilan. Omogućuje vam stvaranje prilagođenih sigurnosnih pravila za svaki put HTTP zahtjeva u vašoj aplikaciji, kao i za različite korisnike. Dakle, možete ukloniti sigurnosno ograničenje na stranicama koje ne zahtijevaju autorizaciju korisnika (kao što je početna stranica). I postavite uloge i ovlasti za određene vrste korisnika.
Dodavanje Spring Security vašoj aplikaciji
Postoje dva načina da svojoj aplikaciji dodate Spring Security. Možete ga odabrati kao ovisnost prilikom generiranja nove Spring Boot aplikacije koristeći Spring initializr, ili ga dodajte svojoj datoteci specifikacije izrade u odjeljku ovisnosti nakon generiranja vašeg projekta.
Ako ste odabrali jednu od opcija projekta Gradle, tada je datoteka ovisnosti izgraditi.gradle. Međutim, ako ste odabrali Maven, ta datoteka jest pom.xml.
Vaš izgraditi.gradle datoteka treba sadržavati sljedeću ovisnost:
dependencies {
implementation 'org.springframework.boot: spring-boot-starter-security'
}
Dok je vaš strom.xml datoteka treba sadržavati sljedeću ovisnost:
org.springframework.boot
spring-boot-starter-security
Uzorak aplikacije korišten u članku dostupan je ovdje GitHub spremište i besplatan je za korištenje pod MIT licencom.
Korištenje Spring Security
Nakon što svojoj aplikaciji dodate ovisnost Spring Security, možete odmah početi koristiti okvir. Jednostavno pokrenite svoju aplikaciju, a zatim idite na početnu stranicu Spring Boota (ili bilo koju stranicu u vašoj aplikaciji). Uzorak aplikacije koristi sljedeći početni kontroler za kontrolu zadanih postavki Spring Boot-a lokalni host: 8080 zahtjev:
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!";
}
}
Izvršavanje vaše aplikacije nakon dodavanja gornje klase jednog kontrolera generira sljedeći početni prikaz:
Primijetit ćete da vas automatski usmjerava na lokalni host: 8080/prijava stranicu, i to čini prije nego što vam dopusti pristup bilo kojoj drugoj stranici aplikacije. U ovoj fazi morat ćete unijeti zadano korisničko ime (koje je korisnik) i automatski generiranu lozinku (koju ćete pronaći u konzoli). Konzola će generirati redak poput sljedećeg:
Using generated security password: c4070465-4c65-4e72-8c3f-3800e631ba81
Svaki put kada ponovno pokrenete svoju aplikaciju automatski generirana lozinka će se promijeniti, ali će korisničko ime ostati isto. Unos zadanog korisničkog imena i lozinke preusmjerit će vas na odgovarajući prikaz u vašoj aplikaciji.
Prilagodba Spring Security
Da biste prilagodili sigurnost svoje aplikacije, morat ćete nadjačati zadanu konfiguraciju Spring Security-a. Ali prije toga (pod pretpostavkom da već imate Spring Web) trebat će vam nekoliko drugih ovisnosti za ovu oglednu aplikaciju:
- Proljetni podaci JPA
- MySQL JDBC upravljački program
- majčina dušica
- Lombok
Okvir Thymeleaf će generirati različite poglede. Lombok će vam pomoći smanjiti kod u vašim objektnim klasama. JPA knjižnica i MySQL upravljački program omogućit će vam korištenje MySQL baze podataka s aplikacijom, ali imate mogućnost korištenja bilo koje baze podataka koja vam odgovara. Korištenje baze podataka znači konfiguriranje aplikacije.svojstva datoteku ispod datoteke resursa.
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
Gornji konfiguracijski kod omogućuje vam povezivanje s lokalnom MySQL bazom podataka pod nazivom proljeće_sigurnost, s korisničkim imenom od korijen, i lozinka (1234). Morat ćete ažurirati ove podatke kako bi odgovarali nazivu baze podataka i vjerodajnicama.
Nakon dodavanja dodatnih ovisnosti i stvaranja baze podataka, možete početi odlučivati koliko će prikaza vaša aplikacija imati. Također ćete morati znati kako izgleda sigurnost svake stranice. Naša ogledna aplikacija ima 6 prikaza:
- Početna stranica
- Stranica za registraciju
- Stranica za prijavu
- Stranica za odjavu
- Korisnička stranica
- Stranica s pogreškom
Jedini pogled koji će zahtijevati autorizaciju korisnika je korisnička stranica. Ova stranica je dostupna samo korisnicima koji se prvo registriraju, a zatim prijave u aplikaciju. Uz zadani paket Spring Boot-a, morat ćete stvoriti još četiri paketa u svojoj aplikaciji.
Klasa kontrolora registracije
Paket kontrolera sadržavat će klase koje obrađuju HTTP zahtjeve. Ovisno o funkciji stranice, obično možete grupirati svaki HTTP zahtjev u jednu klasu kontrolera, kao što je slučaj s Webkontroler razreda. Međutim, prikaz registracije ima više jedinstvenih funkcija, stoga može imati privatnu klasu 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 RegistrationController klasa je pristupnik sigurnosnom aspektu vaše aplikacije. The @RequestMapping anotacija specificira vrstu zahtjeva koji će ovaj kontroler obraditi (zahtjevi za lokalni host: 8080/registar).
The @GetMapping napomena jednostavno označava da ako aplikacija primi zahtjev za /register, the upisnica() metoda bi trebala obraditi taj zahtjev vraćanjem prikaza registracije.
Nakon što posjetitelj klikne gumb za registraciju, zatim @PostMapping anotacija dolazi u obzir. The procesRegistracija() omogućuje vam objavljivanje korisničkih podataka koje dobiva od Upisnica klase u bazu podataka, koristeći Korisničko spremište razreda. Ali prije nego što pohrani ove podatke, procesRegistracija() metoda šifrira korisničku lozinku pomoću ProljetniPasswordEncoder sučelje.
Stvaranje novih sigurnosnih konfiguracija
Od Spring 3.1 programeri sada mogu stvarati konfiguracije za Spring Security koristeći Javu, što znači klase umjesto XML-a. Glavna stvar koju ove konfiguracijske klase zahtijevaju je @Konfiguracija anotacija.
@Configuration
publicclassSecurityConfiguration{
}
The @Konfiguracija napomena označava da je gornja klasa klasa konfiguracije. Ove klase pružaju grah za Kontekst proljetne primjene, koji je spremnik koji Spring koristi za stvaranje i upravljanje različitim komponentama (ili beanovima) aplikacije. Prvi grah u Sigurnosna konfiguracija klasa je passwordEncoder grah.
@Bean
public PasswordEncoder passwordEncoder(){
returnnew BCryptPasswordEncoder();
}
The RegistrationController klasa koristi passwordEncoder bean za kodiranje novih lozinki prije spremanja u bazu podataka. Još jedan važan grah koji ćete morati dodati Sigurnosna konfiguracija klasa je userDetailsService grah.
@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 grah zapošljava Spring Security’sUserDetailsService sučelje za dohvaćanje korisničkog imena i lozinke za provjeru autentičnosti, tijekom sesije prijave korisnika. Dakle, čim kupac klikne gumb za prijavu u prikazu za prijavu, userDetailsService grah izvire u pokret.
Kroz Korisničko spremište, the userDetailsService bean dobiva pristup svim postojećim kupcima u bazi podataka. Ovo sučelje zatim koristi Korisničko spremište kako bi locirao korisnika s odgovarajućim korisničkim imenom i lozinkom, zatim vraća sve atribute ovog kupca kao objekt.
Ako je vraćeni objekt kupac, tada taj kupac dobiva pristup aplikaciji. U suprotnom, stranica će se automatski osvježiti dopuštajući korisniku da unese važeće vjerodajnice.
Lanac filtera
Spring Security'sSecurityFilterChain sučelje je korisno sučelje za programiranje aplikacija (API) koji igra ključnu ulogu u konfiguraciji Spring Security. Ovo sučelje radi sa Spring Security’sHttpSecurity klase za stvaranje lanca filtera za specifične HTTP zahtjeve.
@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 grah iznad koristi SecurityFilterChain API za postizanje nekoliko zadataka. Prvo, koristi se HttpSecurity klase da diktira da samo korisnici koji imaju ulogu USER mogu pristupiti lokalni host: 8080/korisnik. A korisnik dobiva ovu ulogu nakon registracije, zahvaljujući getAuthorities() metoda koju implementira svaki novi objekt kupca.
@Override
public Collection extends="extends" grantedauthority="grantedauthority"?> getAuthorities() {
return Arrays.asList(new SimpleGrantedAuthority("USER"));
}
Lanac filtara omogućuje neovlašteni pristup svim ostalim URL-ovima u aplikaciji. The filterChain grah također koristi formLogin() i Odjavite se() metode HttpSecurity objekt klase.
Ove vam metode omogućuju automatsko usmjeravanje korisnika na određene stranice nakon što obave zadatak. Dakle, korisnik koji unese točne vjerodajnice i klikne gumb za prijavu na /login stranica će automatski biti usmjerena na /user stranica.
Konačno, filterChain bean gradi i vraća lanac filtera, koji ovlaštenim korisnicima omogućuje pristup aplikaciji. Sva tri boba u Sigurnosna konfiguracija razred radi zajedno kako bi osigurao svoju prijavu.
Međutim filterChain grah igra značajniju ulogu diktira razinu autorizacije za svaki HTTP zahtjev. Kako počnete dodavati više stranica svojoj aplikaciji, možete koristiti filterChain bean za postavljanje njihove razine sigurnosti.
Glavna prednost proljetne sigurnosti
Spring Security daje vam potpunu kontrolu ne samo nad tim tko ima pristup vašoj aplikaciji, već i nad vrstom pristupa koju korisnik može imati (kroz značajku korisničkih uloga). Kontrola pristupa jedan je od najvažnijih aspekata svake aplikacije. Davanje općenitim korisnicima nefiltriranog pristupa vašoj aplikaciji zbog ograničenih barijera kontrole pristupa može se pokazati skupom pogreškom.