Tagage oma Spring-rakenduse turvalisus, kasutades ära Spring Security raamistiku pakutavaid tugevaid funktsioone.

Spring Security raamistik kaitseb teie rakendust autentimise ja autoriseerimise kaudu. Vaikeolekus tagab Spring Security, et iga HTTP päringu tee (või leht) teie rakenduses nõuab ühe globaalse kasutaja autentimist.

See raamistik on ka äärmiselt paindlik. See võimaldab teil luua kohandatud turbereegleid teie rakenduse iga HTTP päringu tee ja ka erinevate kasutajate jaoks. Seega saate turvapiirangu eemaldada lehtedelt, mis ei vaja kasutaja luba (nt avaleht). Ja määrake konkreetsete kasutajatüüpide rollid ja volitused.

Kevadise turvalisuse lisamine teie rakendusele

Kevadturvalisuse lisamiseks oma rakendusele on kaks võimalust. Saate selle valida uue Spring Booti rakenduse loomisel sõltuvusena kasutades Spring Initsialiseerivõi lisage see pärast projekti loomist oma järgu spetsifikatsioonifaili sõltuvusjaotises.

Kui valisite ühe Gradle'i projekti suvanditest, siis on sõltuvuste fail ehitama.gradle. Kui aga valisite Maveni, siis see fail on pom.xml.

instagram viewer

Sinu ehitama.gradle fail peaks sisaldama järgmist sõltuvust:

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

Kuigi teie pom.xml fail peaks sisaldama järgmist sõltuvust:


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

Artiklis kasutatud näidisrakendus on saadaval siin GitHubi hoidla ja seda saate MIT-i litsentsi alusel tasuta kasutada.

Spring Security kasutamine

Kui lisate oma rakendusele Spring Security sõltuvuse, saate raamistikku kohe kasutama hakata. Lihtsalt käivitage oma rakendus, seejärel liikuge Spring Booti kodulehele (või mis tahes lehele oma rakenduses). Näidisrakendus kasutab Spring Booti vaikeseadete juhtimiseks järgmist algkontrollerit localhost: 8080 taotlus:

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

Rakenduse käivitamine pärast ülaltoodud ühe kontrolleri klassi lisamist loob järgmise algvaate:

Märkate, et see suunab teid automaatselt lehele localhost: 8080/sisselogimine lehele ja teeb seda enne, kui see võimaldab teil pääseda juurde rakenduse mis tahes muule lehele. Selles etapis peate esitama vaikekasutajanime (see on kasutaja) ja automaatselt genereeritud parooli (mille leiate konsoolist). Konsool loob järgmise rea:

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

Iga kord, kui oma rakenduse taaskäivitate, muutub automaatselt genereeritud parool, kuid kasutajanimi jääb samaks. Vaikimisi kasutajanime ja parooli sisestamine suunab teid teie rakenduses sobivasse vaatesse.

Kevadise turvalisuse kohandamine

Rakenduse turvalisuse kohandamiseks peate alistama Spring Security vaikekonfiguratsiooni. Kuid enne seda (eeldusel, et teil on Spring Web juba olemas) vajate selle näidisrakenduse jaoks mitmeid muid sõltuvusi:

  • Spring Data JPA
  • MySQL JDBC draiver
  • tüümianileht
  • Lombok

Thymeleafi raamistik loob erinevaid vaateid. Lombok aitab teie objektiklassides koodi vähendada. JPA teek ja MySQL-draiver võimaldavad teil rakendusega kasutada MySQL-i andmebaasi, kuid teil on võimalus kasutada mis tahes teile sobivat andmebaasi. Andmebaasi kasutamine tähendab konfigureerimist rakendused.omadused fail ressursside faili all.

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

Ülaltoodud konfiguratsioonikood võimaldab teil luua ühenduse kohaliku MySQL-i andmebaasiga, mida nimetatakse kevad_turvalisus, kasutajanimega juurja parool (1234). Peate neid andmeid värskendama, et need vastaksid teie andmebaasi nimele ja mandaatidele.

Pärast täiendavate sõltuvuste lisamist ja andmebaasi loomist saate hakata otsustama, mitu vaadet teie rakendusel on. Samuti peate teadma, kuidas iga lehe turvalisus välja näeb. Meie näidisrakendusel on 6 vaadet:

  • Avaleht
  • Registreerimisleht
  • Sisselogimisleht
  • Väljalogimisleht
  • Kasutaja leht
  • Vealeht

Ainus vaade, mis nõuab kasutaja luba, on kasutaja leht. See leht on juurdepääsetav ainult kasutajatele, kes esmalt registreeruvad ja seejärel rakendusse sisse logivad. Lisaks Spring Booti vaikepaketile peate oma rakenduses looma veel neli paketti.

Registreerimiskontrolleri klass

Kontrolleri pakett sisaldab klasse, mis käsitlevad HTTP-päringuid. Sõltuvalt lehe funktsioonist saate tavaliselt rühmitada iga HTTP-päringu ühte kontrolleriklassi, nagu see on Veebikontroller klass. Registreerimisvaates on aga unikaalsemad funktsioonid, seega võib sellel olla privaatkontrolleri klass:

@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 Registreerimiskontroller klass on värav teie rakenduse turvaaspekti juurde. The @RequestMapping märkus määrab päringu tüübi, mida see kontroller käsitleb (taotlused localhost: 8080 / register).

The @GetMapping märkus lihtsalt näitab, et kui rakendus saab taotluse /register, registreerimisvorm() meetod peaks seda taotlust käsitlema, tagastades registreerimisvaate.

Kui külastaja klõpsab registreerimisnupul, siis @PostMapping annotatsioon tuleb mängu. The protsessiregistreerimine() meetod võimaldab teil postitada kasutajaandmed, mille ta saab Registreerimisvorm klassi andmebaasi, kasutades User Repository klass. Kuid enne nende andmete salvestamist protsessiregistreerimine() meetod krüpteerib kasutaja parooli kasutades Kevade omaParoolikooder liides.

Uute turvakonfiguratsioonide loomine

Alates versioonist Spring 3.1 saavad arendajad nüüd luua Spring Security konfiguratsioone Java abil, mis tähendab XML-i asemel klasse. Peamine asi, mida need konfiguratsiooniklassid nõuavad, on @Konfiguratsioon annotatsioon.

@Configuration
publicclassSecurityConfiguration{
}

The @Konfiguratsioon annotatsioon näitab, et ülaltoodud klass on konfiguratsiooniklass. Need klassid pakuvad ube Kevadine rakenduskontekst, mis on konteiner, mida Spring kasutab rakenduse erinevate komponentide (või ubade) loomiseks ja haldamiseks. Esimene uba Turvalisuse konfiguratsioon klass on paroolEncoder uba.

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

The Registreerimiskontroller klass kasutab paroolEncoder bean uute paroolide kodeerimiseks enne nende andmebaasi salvestamist. Veel üks oluline uba, mille peate sellesse lisama Turvalisuse konfiguratsioon klass on userDetailsService uba.

@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 uba annab tööd Kevadine turvalisusUserDetailsService liides kasutaja kasutajanime ja parooli hankimiseks autentimiseks kliendi sisselogimisseansi ajal. Seega, niipea kui klient klõpsab sisselogimisvaates sisselogimisnupul, kuvatakse userDetailsService uba hakkab liikuma.

Läbi User Repository, userDetailsService bean saab juurdepääsu kõigile olemasolevatele klientidele andmebaasis. See liides kasutab seejärel User Repository sobiva kasutajanime ja parooliga kasutaja leidmiseks, tagastab seejärel kõik selle kliendi atribuudid objektina.

Kui tagastatud objekt on klient, saab see klient rakendusele juurdepääsu. Vastasel juhul värskendatakse lehte automaatselt, võimaldades kasutajal sisestada kehtivad mandaadid.

Filtri kett

Kevadine turvalisusSecurityFilterChain liides on kasulik rakendusliides (API) mis mängib Spring Security konfiguratsioonis olulist rolli. See liides töötab koos Kevadine turvalisusHttpSecurity klassi konkreetsete HTTP-päringute jaoks filtriahela loomiseks.

@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 filterkett bean eespool kasutab SecurityFilterChain API mitme ülesande täitmiseks. Esiteks kasutab see HttpSecurity klass dikteerib, et pääsevad juurde ainult kasutajad, kellel on KASUTAJA roll localhost: 8080/kasutaja. Ja kasutaja saab selle rolli pärast registreerimist, tänu getAuthorities() meetod, mida iga uus kliendiobjekt rakendab.

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

Filtriahel võimaldab autentimata juurdepääsu kõigile teistele rakenduse URL-idele. The filterkett uba kasutab ka formLogin() ja Logi välja() meetodid HttpSecurity klassi objekt.

Need meetodid võimaldavad teil pärast toimingu sooritamist kasutaja automaatselt konkreetsetele lehtedele suunata. Niisiis, kasutaja, kes sisestab õiged mandaadid ja klõpsab sisselogimisnupul /login leht suunatakse automaatselt lehele /user lehel.

Lõpuks, filterkett bean koostab ja tagastab filtriahela, mis võimaldab volitatud kasutajatel rakendusele juurde pääseda. Kõik kolm uba Turvalisuse konfiguratsioon klassiga koostööd, et teie taotlus kindlustada.

Siiski, filterkett bean mängib olulisemat rolli autoriseerimistaseme määramisel iga HTTP päring. Kui hakkate oma rakendusse uusi lehti lisama, saate kasutada filterkett bean oma turvataseme määramiseks.

Kevadise turvalisuse peamine eelis

Spring Security annab teile täieliku kontrolli mitte ainult selle üle, kellel on juurdepääs teie rakendusele, vaid ka selle üle, mis tüüpi juurdepääs kasutajal võib olla (kasutajarollide funktsiooni kaudu). Juurdepääsukontroll on mis tahes rakenduse üks olulisemaid aspekte. Üldkasutajatele teie rakendusele filtreerimata juurdepääsu andmine piiratud juurdepääsukontrolli tõkete tõttu võib osutuda kulukaks veaks.