Zagotovite varnost svoje aplikacije Spring z uporabo robustnih funkcij, ki jih ponuja ogrodje Spring Security.

Ogrodje Spring Security ščiti vašo aplikacijo s preverjanjem pristnosti in avtorizacijo. V privzetem stanju Spring Security zagotavlja, da vsaka pot zahteve HTTP (ali stran) v vaši aplikaciji zahteva avtentikacijo enega samega globalnega uporabnika.

Ta okvir je tudi izjemno prilagodljiv. Omogoča vam ustvarjanje prilagojenih varnostnih pravil za vsako pot zahteve HTTP v vaši aplikaciji, pa tudi za različne uporabnike. Tako lahko odstranite varnostno omejitev na straneh, ki ne zahtevajo avtorizacije uporabnika (kot je domača stran). In nastavite vloge in pooblastila za določene vrste uporabnikov.

Dodajanje Spring Security vaši aplikaciji

Svoji aplikaciji lahko dodate Spring Security na dva načina. Lahko ga izberete kot odvisnost pri ustvarjanju nove aplikacije Spring Boot z uporabo Spring initializr, ali pa ga dodajte v datoteko s specifikacijo gradnje v razdelku odvisnosti po ustvarjanju projekta.

instagram viewer

Če ste izbrali eno od možnosti projekta Gradle, potem je datoteka odvisnosti build.gradle. Vendar, če ste izbrali Maven, potem je ta datoteka pom.xml.

Vaš build.gradle datoteka mora vsebovati naslednjo odvisnost:

dependencies {
implementation 'org.springframework.boot: spring-boot-starter-security'
}

Medtem ko vaš pom.xml datoteka mora vsebovati naslednjo odvisnost:


org.springframework.boot
spring-boot-starter-security

Vzorčna aplikacija, uporabljena v članku, je na voljo tukaj Repozitorij GitHub in je brezplačen za uporabo pod licenco MIT.

Uporaba Spring Security

Ko svoji aplikaciji dodate odvisnost Spring Security, lahko takoj začnete uporabljati ogrodje. Preprosto izvedite svojo aplikacijo in se nato pomaknite na domačo stran programa Spring Boot (ali katero koli stran v vaši aplikaciji). Vzorčna aplikacija uporablja naslednji začetni krmilnik za nadzor privzete vrednosti programa Spring Boot lokalni gostitelj: 8080 prošnja:

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!";
}
}

Izvajanje vaše aplikacije po dodajanju zgornjega razreda posameznega krmilnika ustvari naslednji začetni pogled:

Opazili boste, da vas samodejno usmeri na lokalni gostitelj: 8080/prijava stran, in to stori, preden vam omogoči dostop do katere koli druge strani aplikacije. Na tej stopnji boste morali vnesti privzeto uporabniško ime (ki je uporabnik) in samodejno ustvarjeno geslo (ki ga boste našli v konzoli). Konzola bo ustvarila vrstico, kot je ta:

Using generated security password: c4070465-4c65-4e72-8c3f-3800e631ba81

Vsakič, ko znova zaženete aplikacijo, se bo samodejno ustvarjeno geslo spremenilo, uporabniško ime pa bo ostalo isto. Vnos privzetega uporabniškega imena in gesla vas bo usmeril na ustrezen pogled v vaši aplikaciji.

Prilagajanje Spring Security

Če želite prilagoditi varnost svoje aplikacije, boste morali preglasiti privzeto konfiguracijo Spring Security. Toda pred tem (ob predpostavki, da že imate Spring Web) boste potrebovali več drugih odvisnosti za to vzorčno aplikacijo:

  • Pomladni podatki JPA
  • Gonilnik MySQL JDBC
  • Timijan
  • Lombok

Ogrodje Thymeleaf bo ustvarilo različne poglede. Lombok bo pomagal zmanjšati kodo v vaših objektnih razredih. Knjižnica JPA in gonilnik MySQL vam omogočata uporabo baze podatkov MySQL z aplikacijo, vendar imate možnost uporabe katere koli baze podatkov, ki vam ustreza. Uporaba baze podatkov pomeni konfiguracijo aplikacije.lastnosti datoteko pod datoteko virov.

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

Zgornja konfiguracijska koda vam omogoča povezavo z lokalno bazo podatkov MySQL, imenovano spring_security, z uporabniškim imenom koreninain geslo (1234). Te podatke boste morali posodobiti, da se bodo ujemali z imenom vaše baze podatkov in poverilnicami.

Ko dodate dodatne odvisnosti in ustvarite bazo podatkov, se lahko začnete odločati, koliko pogledov bo imela vaša aplikacija. Prav tako boste morali vedeti, kako izgleda varnost za vsako stran. Naša vzorčna aplikacija ima 6 pogledov:

  • Domača stran
  • Stran za registracijo
  • Stran za prijavo
  • Stran za odjavo
  • Uporabniška stran
  • Stran z napako

Edini pogled, ki bo zahteval avtorizacijo uporabnika, je uporabniška stran. Ta stran je dostopna samo uporabnikom, ki se najprej registrirajo in nato prijavijo v aplikacijo. Poleg privzetega paketa Spring Boot boste morali v svoji aplikaciji ustvariti še štiri druge pakete.

Razred krmilnika registracije

Paket krmilnika bo vseboval razrede, ki obravnavajo zahteve HTTP. Glede na funkcijo strani lahko vsako zahtevo HTTP običajno združite v en razred krmilnika, kot je to v primeru WebController razred. Vendar ima pogled registracije več edinstvenih funkcij, zato ima lahko zasebni razred krmilnika:

@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 razred je prehod do varnostnega vidika vaše aplikacije. The @RequestMapping opomba določa vrsto zahteve, ki jo bo obravnaval ta krmilnik (zahteve za lokalni gostitelj: 8080/register).

The @GetMapping opomba preprosto nakazuje, da če aplikacija prejme zahtevo za /register, the Obrazec za registracijo() metoda bi morala obravnavati to zahtevo tako, da vrne pogled registracije.

Ko obiskovalec klikne gumb za registracijo, nato se @PostMapping opomba pride v poštev. The procesRegistration() omogoča objavo uporabniških podatkov, ki jih pridobi od Obrazec za registracijo razreda v bazo podatkov z uporabo UserRepository razred. Toda preden shrani te podatke, je procesRegistration() metoda šifrira uporabniško geslo z uporabo PomladniPasswordEncoder vmesnik.

Ustvarjanje novih varnostnih konfiguracij

Od pomladi 3.1 lahko razvijalci zdaj ustvarijo konfiguracije za Spring Security z uporabo Jave, kar pomeni razrede namesto XML. Glavna stvar, ki jo zahtevajo ti konfiguracijski razredi, je @Konfiguracija opomba.

@Configuration
publicclassSecurityConfiguration{
}

The @Konfiguracija opomba označuje, da je zgornji razred konfiguracijski razred. Ti razredi zagotavljajo fižol Kontekst spomladanske aplikacije, ki je vsebnik, ki ga Spring uporablja za ustvarjanje in upravljanje različnih komponent (ali gradnikov) aplikacije. Prvi fižol v SecurityConfiguration razred je passwordEncoder fižol.

@Bean
public PasswordEncoder passwordEncoder(){
 returnnew BCryptPasswordEncoder();
}

The RegistrationController razred uporablja passwordEncoder bean za kodiranje novih gesel, preden jih shranite v bazo podatkov. Še en pomemben fižol, ki ga boste morali dodati SecurityConfiguration razred je userDetailsService fižol.

@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 fižol zaposluje Pomladna varnostUserDetailsService vmesnik za pridobitev uporabniškega imena in gesla uporabnika za preverjanje pristnosti med sejo prijave stranke. Torej, takoj ko stranka klikne gumb za prijavo v pogledu za prijavo, se userDetailsService fižol požene v gibanje.

Skozi UserRepository, the userDetailsService bean pridobi dostop do vseh obstoječih strank v bazi podatkov. Ta vmesnik nato uporablja UserRepository da poišče uporabnika z ujemajočim se uporabniškim imenom in geslom, nato vrne vse atribute te stranke kot objekt.

Če je vrnjeni predmet stranka, potem ta stranka pridobi dostop do aplikacije. V nasprotnem primeru se bo stran samodejno osvežila in uporabniku omogočila vnos veljavnih poverilnic.

Veriga filtra

Pomladna varnostSecurityFilterChain vmesnik je uporaben aplikacijski programski vmesnik (API) ki igra bistveno vlogo v konfiguraciji Spring Security. Ta vmesnik deluje z Pomladna varnostHttpSecurity razreda za ustvarjanje verige filtrov za določene zahteve 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 bean zgoraj uporablja SecurityFilterChain API za opravljanje več nalog. Prvič, uporablja HttpSecurity razreda, ki narekuje, da lahko dostopajo samo uporabniki, ki imajo vlogo UPORABNIKA lokalni gostitelj: 8080/uporabnik. In uporabnik dobi to vlogo po registraciji, zahvaljujoč getAuthorities() metoda, ki jo izvaja vsak nov objekt stranke.

@Override
public Collection extends="extends" grantedauthority="grantedauthority"?> getAuthorities() {
 return Arrays.asList(new SimpleGrantedAuthority("USER"));
}

Veriga filtrov omogoča nepreverjen dostop do vseh drugih URL-jev v aplikaciji. The filterChain fižol uporablja tudi formLogin() in Odjava() metode HttpSecurity predmet razreda.

Te metode vam omogočajo, da uporabnika samodejno usmerite na določene strani, potem ko izvede nalogo. Torej, uporabnik, ki vnese pravilne poverilnice in klikne gumb za prijavo na strani /login stran bo samodejno usmerjena na /user strani.

Končno, filterChain bean zgradi in vrne verigo filtrov, ki pooblaščenim uporabnikom omogoča dostop do aplikacije. Vsi trije fižoli v SecurityConfiguration razred delajte skupaj, da zaščitite svojo prijavo.

Vendar pa je filterChain fižol igra pomembnejšo vlogo pri določanju ravni avtorizacije za vsako zahtevo HTTP. Ko začnete svoji aplikaciji dodajati več strani, lahko uporabite filterChain bean, da nastavite svojo varnostno raven.

Glavna prednost spomladanske varnosti

Spring Security vam omogoča popoln nadzor ne le nad tem, kdo ima dostop do vaše aplikacije, ampak tudi nad vrsto dostopa, ki ga lahko ima uporabnik (prek funkcije uporabniških vlog). Nadzor dostopa je eden najpomembnejših vidikov vsake aplikacije. Omogočanje splošnemu uporabniku nefiltriranega dostopa do vaše aplikacije zaradi omejenih ovir za nadzor dostopa se lahko izkaže za drago napako.