Nodrošiniet savas Spring lietojumprogrammas drošību, izmantojot Spring Security sistēmas piedāvātās robustās funkcijas.

Pavasara drošības sistēma nodrošina jūsu pieteikumu, izmantojot autentifikāciju un autorizāciju. Noklusējuma stāvoklī Spring Security nodrošina, ka katram HTTP pieprasījuma ceļam (vai lapai) jūsu lietojumprogrammā ir nepieciešama viena globālā lietotāja autentifikācija.

Šis ietvars ir arī ļoti elastīgs. Tas ļauj jums izveidot pielāgotus drošības noteikumus katram HTTP pieprasījuma ceļam jūsu lietojumprogrammā, kā arī dažādiem lietotājiem. Tādējādi varat noņemt drošības ierobežojumu lapās, kurām nav nepieciešama lietotāja autorizācija (piemēram, sākumlapa). Un iestatiet noteikta veida lietotāju lomas un pilnvaras.

Pavasara drošības pievienošana jūsu lietojumprogrammai

Ir divi veidi, kā savai lietojumprogrammai pievienot Spring Security. Varat to atlasīt kā atkarību, ģenerējot jaunu Spring Boot lietojumprogrammu izmantojot pavasara inicializr, vai pievienojiet to savam būvējuma specifikācijas failam atkarības sadaļā pēc projekta ģenerēšanas.

instagram viewer

Ja atlasījāt kādu no Gradle projekta opcijām, tad atkarību fails ir celt.gradle. Tomēr, ja izvēlējāties Maven, tad šis fails ir pom.xml.

Jūsu celt.gradle failā jāietver šāda atkarība:

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

Kamēr jūsu pom.xml failā jāietver šāda atkarība:


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

Rakstā izmantotais lietojumprogrammas paraugs ir pieejams šajā GitHub repozitorijs un to varat izmantot bez maksas saskaņā ar MIT licenci.

Pavasara drošības izmantošana

Kad savai lietojumprogrammai pievienojat Spring Security atkarību, varat nekavējoties sākt lietot sistēmu. Vienkārši izpildiet savu lietojumprogrammu, pēc tam dodieties uz Spring Boot sākumlapu (vai jebkuru jūsu lietojumprogrammas lapu). Lietojumprogrammas paraugs izmanto šādu sākotnējo kontrolleri, lai kontrolētu Spring Boot noklusējuma iestatījumus vietējais saimnieks: 8080 pieprasījums:

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

Palaižot lietojumprogrammu pēc vienas kontrollera klases pievienošanas iepriekš, tiek ģenerēts šāds sākotnējais skats:

Jūs ievērosiet, ka tas automātiski novirza jūs uz localhost: 8080/pieteikšanās lapu, un tas tiek darīts, pirms tas ļauj piekļūt jebkurai citai lietojumprogrammas lapai. Šajā posmā jums būs jānorāda noklusējuma lietotājvārds (kas ir lietotājs) un automātiski ģenerētā parole (ko atradīsit konsolē). Konsole ģenerēs šādu rindiņu:

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

Katru reizi, restartējot lietojumprogrammu, automātiski ģenerētā parole mainīsies, bet lietotājvārds paliks nemainīgs. Ievadot noklusējuma lietotājvārdu un paroli, jūs tiksit novirzīts uz atbilstošo lietojumprogrammas skatu.

Pavasara drošības pielāgošana

Lai pielāgotu lietojumprogrammas drošību, jums ir jāignorē Spring Security noklusējuma konfigurācija. Bet pirms tam (pieņemot, ka jums jau ir Spring Web) šim lietojumprogrammas paraugam būs nepieciešamas vairākas citas atkarības:

  • Pavasara datu JPA
  • MySQL JDBC draiveris
  • Timiāna lapa
  • Lomboka

Thymeleaf sistēma radīs dažādus skatus. Lombok palīdzēs samazināt kodu jūsu objektu klasēs. JPA bibliotēka un MySQL draiveris ļaus kopā ar lietojumprogrammu izmantot MySQL datu bāzi, taču jums ir iespēja izmantot jebkuru jums piemērotu datubāzi. Izmantojot datubāzi, ir jākonfigurē lietojumprogrammas.īpašības failu zem resursu faila.

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

Iepriekš minētais konfigurācijas kods ļauj izveidot savienojumu ar vietējo MySQL datu bāzi, ko sauc pavasara_drošība, ar lietotājvārdu sakneun paroli (1234). Šie dati būs jāatjaunina, lai tie atbilstu jūsu datu bāzes nosaukumam un akreditācijas datiem.

Pēc papildu atkarību pievienošanas un datu bāzes izveidošanas varat sākt izlemt, cik skatījumu būs jūsu lietojumprogrammai. Jums arī jāzina, kā izskatās katras lapas drošība. Mūsu pieteikuma paraugam ir 6 skati:

  • Mājas lapa
  • Reģistrācijas lapa
  • Pieteikšanās lapa
  • Atteikšanās lapa
  • Lietotāja lapa
  • Kļūdas lapa

Vienīgais skats, kuram būs nepieciešama lietotāja autorizācija, ir lietotāja lapa. Šī lapa ir pieejama tikai tiem lietotājiem, kuri vispirms reģistrējas un pēc tam pierakstās lietojumprogrammā. Papildus Spring Boot noklusējuma pakotnei lietojumprogrammā būs jāizveido vēl četras pakotnes.

Reģistrācijas kontroliera klase

Kontrolieru pakotnē būs klases, kas apstrādā HTTP pieprasījumus. Atkarībā no lapas funkcijas jūs parasti varat grupēt katru HTTP pieprasījumu vienā kontrollera klasē, kā tas ir gadījumā ar WebController klasē. Tomēr reģistrācijas skatam ir unikālākas funkcijas, līdz ar to tam var būt privāta kontroliera klase:

@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 Reģistrācijas kontrolieris klase ir vārteja uz jūsu lietojumprogrammas drošības aspektu. The @RequestMapping anotācija norāda pieprasījuma veidu, ko šis kontrolleris apstrādās (pieprasa localhost: 8080/reģistrs).

The @GetMapping anotācija vienkārši norāda, ka, ja pieteikums saņem pieprasījumu par /register, reģistrācijas forma() metodei ir jāapstrādā šis pieprasījums, atgriežot reģistrācijas skatu.

Pēc tam, kad apmeklētājs noklikšķina uz pogas Reģistrēties, tad uz @PostMapping tiek izmantota anotācija. The processReģistrācija() metode ļauj publicēt lietotāja datus, ko tā iegūst no Reģistrācijas forma klasei datu bāzē, izmantojot UserRepository klasē. Bet pirms tas saglabā šos datus, processReģistrācija() metode šifrē lietotāja paroli, izmantojot PavasarisParoles kodētājs saskarne.

Jaunu drošības konfigurāciju izveide

Kopš Spring 3.1 izstrādātāji tagad var izveidot Spring Security konfigurācijas, izmantojot Java, kas nozīmē klases, nevis XML. Galvenais, kas nepieciešams šīm konfigurācijas klasēm, ir @Konfigurācija anotācija.

@Configuration
publicclassSecurityConfiguration{
}

The @Konfigurācija anotācija norāda, ka iepriekš minētā klase ir konfigurācijas klase. Šīs klases nodrošina pupiņas, lai Pavasara pieteikuma konteksts, kas ir konteiners, ko Spring izmanto, lai izveidotu un pārvaldītu dažādus lietojumprogrammas komponentus (vai pupiņas). Pirmā pupa Drošības konfigurācija klase ir PasswordEncoder pupa.

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

The Reģistrācijas kontrolieris klase izmanto PasswordEncoder bean, lai iekodētu jaunas paroles pirms to saglabāšanas datu bāzē. Vēl viena svarīga pupiņa, kas jums būs jāpievieno Drošības konfigurācija klase ir userDetailsService pupa.

@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 pupa nodarbina Pavasara drošībaUserDetailsService saskarne, lai izgūtu lietotāja lietotājvārdu un paroli autentifikācijai klienta pieteikšanās sesijas laikā. Tātad, tiklīdz klients pieteikšanās skatā noklikšķina uz pieteikšanās pogas, userDetailsService pupa sāk kustēties.

Caur UserRepository, userDetailsService bean iegūst piekļuvi visiem esošajiem klientiem datu bāzē. Pēc tam šī saskarne izmanto UserRepository lai atrastu lietotāju ar atbilstošu lietotājvārdu un paroli, pēc tam atgriež visus šī klienta atribūtus kā objektu.

Ja atgrieztais objekts ir klients, tad šis klients iegūst piekļuvi lietojumprogrammai. Pretējā gadījumā lapa tiks automātiski atsvaidzināta, ļaujot lietotājam ievadīt derīgus akreditācijas datus.

Filtru ķēde

Pavasara apsardzeSecurityFilterChain interfeiss ir noderīgs lietojumprogrammu saskarne (API) kam ir būtiska loma pavasara drošības konfigurācijā. Šī saskarne darbojas ar Pavasara drošībaHttpSecurity klasē, lai izveidotu filtru ķēdi konkrētiem HTTP pieprasījumiem.

@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 filtra ķēde pupiņas iepriekš izmanto SecurityFilterChain API, lai veiktu vairākus uzdevumus. Pirmkārt, tas izmanto HttpSecurity klase, lai noteiktu, ka var piekļūt tikai tie lietotāji, kuriem ir LIETOTĀJA loma localhost: 8080/lietotājs. Un lietotājs iegūst šo lomu pēc reģistrācijas, pateicoties getAuthorities() metode, ko ievieš katrs jauns klienta objekts.

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

Filtru ķēde nodrošina neautentificētu piekļuvi visiem citiem lietojumprogrammas URL. The filtra ķēde pupa izmanto arī formLogin() un izlogoties() metodes HttpSecurity klases objekts.

Šīs metodes ļauj automātiski novirzīt lietotāju uz noteiktām lapām pēc uzdevuma veikšanas. Tātad lietotājs, kurš ievada pareizos akreditācijas datus un noklikšķina uz pieteikšanās pogas /login lapa tiks automātiski novirzīta uz /user lappuse.

Visbeidzot, filtra ķēde bean izveido un atgriež filtru ķēdi, kas ļauj autorizētiem lietotājiem piekļūt lietojumprogrammai. Visas trīs pupiņas Drošības konfigurācija klase strādā kopā, lai nodrošinātu jūsu pieteikumu.

Tomēr filtra ķēde bean spēlē nozīmīgāku lomu, diktējot autorizācijas līmeni katrs HTTP pieprasījums. Kad sākat savai lietojumprogrammai pievienot vairāk lapu, varat izmantot filtra ķēde bean, lai iestatītu to drošības līmeni.

Pavasara drošības galvenais ieguvums

Spring Security sniedz jums pilnīgu kontroli ne tikai pār to, kam ir piekļuve jūsu lietojumprogrammai, bet arī to, kāda veida piekļuve var būt lietotājam (izmantojot lietotāja lomu funkciju). Piekļuves kontrole ir viens no vissvarīgākajiem jebkuras lietojumprogrammas aspektiem. Piešķirt vispārējiem lietotājiem nefiltrētu piekļuvi jūsu lietojumprogrammai ierobežotu piekļuves kontroles barjeru dēļ var izrādīties dārga kļūda.