Varmista Spring-sovelluksesi turvallisuus hyödyntämällä Spring Security -kehyksen tarjoamia kestäviä ominaisuuksia.

Spring Security -kehys suojaa sovelluksesi todennuksen ja valtuutuksen avulla. Oletustilassaan Spring Security varmistaa, että jokainen sovelluksesi HTTP-pyyntöpolku (tai -sivu) vaatii yhden globaalin käyttäjän todennuksen.

Tämä kehys on myös erittäin joustava. Sen avulla voit luoda mukautettuja suojaussääntöjä kullekin sovelluksesi HTTP-pyyntöpolulle sekä eri käyttäjille. Joten voit poistaa suojausrajoituksen sivuilta, jotka eivät vaadi käyttäjän valtuutusta (kuten kotisivu). Ja määritä tiettyjen käyttäjätyyppien roolit ja valtuudet.

Kevätturvallisuuden lisääminen sovellukseesi

On kaksi tapaa lisätä Spring Security sovellukseesi. Voit joko valita sen riippuvuudeksi luodessasi uutta Spring Boot -sovellusta käyttäen Spring inicializeriatai lisää se koontiversion määritystiedostoon riippuvuusosiossa projektin luomisen jälkeen.

Jos valitsit yhden Gradle-projektivaihtoehdoista, riippuvuustiedosto on build.gradle. Jos kuitenkin valitsit Mavenin, se tiedosto on pom.xml.

instagram viewer

Sinun build.gradle tiedoston tulee sisältää seuraava riippuvuus:

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

Kun pom.xml tiedoston tulee sisältää seuraava riippuvuus:


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

Artikkelissa käytetty mallisovellus on saatavilla tästä GitHub-arkisto ja sen käyttö on ilmaista MIT-lisenssin alaisena.

Spring Securityn käyttö

Kun olet lisännyt Spring Securityn riippuvuuden sovellukseesi, voit aloittaa viitekehyksen käytön välittömästi. Suorita sovelluksesi ja siirry sitten Spring Bootin kotisivulle (tai mille tahansa sovelluksesi sivulle). Esimerkkisovellus käyttää seuraavaa alkuohjainta Spring Bootin oletusarvon ohjaamiseen paikallinen isäntä: 8080 pyyntö:

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

Sovelluksen suorittaminen yhden ohjainluokan lisäämisen jälkeen luo seuraavan aloitusnäkymän:

Huomaat, että se ohjaa sinut automaattisesti localhost: 8080/kirjautuminen -sivulle, ja se tekee tämän ennen kuin voit käyttää muita sovelluksen sivuja. Tässä vaiheessa sinun on annettava oletuskäyttäjätunnus (joka on käyttäjä) ja automaattisesti luotu salasana (jotka löydät konsolista). Konsoli luo seuraavanlaisen rivin:

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

Aina kun käynnistät sovelluksen uudelleen, automaattisesti luotu salasana vaihtuu, mutta käyttäjätunnus pysyy samana. Oletuskäyttäjätunnuksen ja salasanan syöttäminen ohjaa sinut sovelluksesi oikeaan näkymään.

Kevätturvallisuuden mukauttaminen

Jos haluat mukauttaa sovelluksesi suojausta, sinun on ohitettava Spring Securityn oletusasetukset. Mutta ennen sitä (olettaen, että sinulla on jo Spring Web) tarvitset useita muita riippuvuuksia tälle esimerkkisovellukselle:

  • Spring Data JPA
  • MySQL JDBC-ohjain
  • timjamilehti
  • Lombok

Thymeleaf-kehys tuottaa erilaisia ​​näkemyksiä. Lombok auttaa vähentämään koodia objektiluokissasi. JPA-kirjaston ja MySQL-ajurin avulla voit käyttää MySQL-tietokantaa sovelluksen kanssa, mutta sinulla on mahdollisuus käyttää mitä tahansa tietokantaa, johon olet tyytyväinen. Tietokannan käyttäminen tarkoittaa sovellukset.ominaisuudet tiedosto resurssitiedoston alla.

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

Yllä oleva konfigurointikoodi mahdollistaa yhteyden muodostamisen paikalliseen MySQL-tietokantaan nimeltä kevät_turvallisuus, jonka käyttäjätunnus on juurija salasana (1234). Sinun on päivitettävä nämä tiedot vastaamaan tietokantaasi nimeä ja tunnistetietoja.

Kun olet lisännyt lisäriippuvuutesi ja luonut tietokannan, voit alkaa päättää, kuinka monta näkymää sovelluksellasi on. Sinun on myös tiedettävä, miltä kunkin sivun suojaus näyttää. Esimerkkisovelluksellamme on 6 näkymää:

  • Kotisivu
  • Rekisteröintisivu
  • Sisäänkirjautumissivu
  • Kirjautumissivu
  • Käyttäjäsivu
  • Virhesivu

Ainoa näkymä, joka vaatii käyttäjän valtuutuksen, on käyttäjäsivu. Tämä sivu on vain niille käyttäjille, jotka ensin rekisteröityvät ja kirjautuvat sitten sisään sovellukseen. Spring Bootin oletuspaketin lisäksi sinun on luotava sovellukseesi neljä muuta pakettia.

Rekisteröinnin valvojaluokka

Ohjainpaketti sisältää luokat, jotka käsittelevät HTTP-pyyntöjä. Sivun toiminnasta riippuen voit yleensä ryhmitellä jokaisen HTTP-pyynnön yhdeksi ohjainluokkaan, kuten WebController luokkaa. Rekisteröintinäkymässä on kuitenkin ainutlaatuisempia toimintoja, joten sillä voi olla yksityinen ohjainluokka:

@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 Registration Controller luokka on portti sovelluksesi turvallisuusnäkökohtaan. The @RequestMapping huomautus määrittää pyynnön tyypin, jonka tämä ohjain käsittelee (pyynnöt localhost: 8080/rekisteri).

The @GetMapping huomautus osoittaa yksinkertaisesti, että jos sovellus vastaanottaa pyynnön /register, ilmoittautumislomake() menetelmän pitäisi käsitellä kyseinen pyyntö palauttamalla rekisteröintinäkymä.

Kun vierailija napsauttaa rekisteröintipainiketta, sitten @PostMapping huomautus tulee peliin. The processRegistration() -menetelmän avulla voit lähettää käyttäjätiedot, jotka se saa Ilmoittautumislomake luokka tietokantaan käyttämällä UserRepository luokkaa. Mutta ennen kuin se tallentaa nämä tiedot, processRegistration() menetelmä salaa käyttäjän salasanan käyttämällä KeväänPasswordEncoder käyttöliittymä.

Uusien suojausasetusten luominen

Spring 3.1:stä lähtien kehittäjät voivat nyt luoda Spring Securityn konfiguraatioita Javalla, mikä tarkoittaa luokkia XML: n sijaan. Tärkein asia, jota nämä konfigurointiluokat vaativat, on @Määritykset huomautus.

@Configuration
publicclassSecurityConfiguration{
}

The @Määritykset huomautus osoittaa, että yllä oleva luokka on konfigurointiluokka. Nämä luokat tarjoavat pavut Kevätsovelluskonteksti, joka on säilö, jota Spring käyttää sovelluksen eri komponenttien (tai papujen) luomiseen ja hallintaan. Ensimmäinen papu SecurityConfiguration luokka on PasswordEncoder papu.

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

The Registration Controller luokka käyttää PasswordEncoder bean koodaa uudet salasanat ennen niiden tallentamista tietokantaan. Toinen tärkeä papu, joka sinun on lisättävä siihen SecurityConfiguration luokka on userDetailsService papu.

@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 papu työllistää KevätturvallisuusUserDetailsService käyttöliittymä, jolla voit hakea käyttäjän käyttäjänimen ja salasanan todennusta varten asiakkaan kirjautumisistunnon aikana. Joten heti kun asiakas napsauttaa kirjautumispainiketta kirjautumisnäkymässä, userDetailsService papu lähtee liikkeelle.

Läpi UserRepository, userDetailsService bean saa pääsyn kaikkiin tietokannan olemassa oleviin asiakkaisiin. Tämä käyttöliittymä käyttää sitten UserRepository paikantaakseen käyttäjän, jolla on vastaava käyttäjätunnus ja salasana, ja palauttaa sitten kaikki tämän asiakkaan määritteet objektina.

Jos palautettu kohde on asiakas, tämä asiakas saa pääsyn sovellukseen. Muussa tapauksessa sivu päivittyy automaattisesti, jolloin käyttäjä voi syöttää kelvolliset tunnistetiedot.

Suodatinketju

KevätturvallisuusSecurityFilterChain käyttöliittymä on hyödyllinen sovellusohjelmointirajapinta (API) jolla on olennainen rooli Spring Security -kokoonpanossa. Tämä käyttöliittymä toimii KevätturvallisuusHttpSecurity luokassa suodatinketjun luomiseksi tietyille HTTP-pyynnöille.

@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 suodatinketju bean edellä käyttää SecurityFilterChain API useiden tehtävien suorittamiseen. Ensinnäkin se käyttää HttpSecurity luokka sanella, että vain käyttäjät, joilla on KÄYTTÄJÄ rooli, voivat käyttää localhost: 8080/käyttäjä. Ja käyttäjä saa tämän roolin rekisteröitymisen jälkeen, kiitos getAuthorities() menetelmä, jonka jokainen uusi asiakasobjekti ottaa käyttöön.

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

Suodatinketju mahdollistaa todentamattoman pääsyn kaikkiin muihin sovelluksen URL-osoitteisiin. The suodatinketju papu hyödyntää myös formLogin() ja kirjautua ulos() menetelmät HttpSecurity luokan objekti.

Näiden menetelmien avulla voit ohjata käyttäjän automaattisesti tietyille sivuille tehtävän suorittamisen jälkeen. Eli käyttäjä, joka syöttää oikeat tunnistetiedot ja napsauttaa sisäänkirjautumispainiketta /login sivu ohjataan automaattisesti osoitteeseen /user sivu.

Lopuksi, suodatinketju bean rakentaa ja palauttaa suodatinketjun, jonka avulla valtuutetut käyttäjät voivat käyttää sovellusta. Kaikki kolme pavut SecurityConfiguration luokka työskentelee yhdessä turvataksesi hakemuksesi.

Kuitenkin suodatinketju beanilla on tärkeämpi rooli valtuutustason sanelemisessa jokainen HTTP-pyyntö. Kun alat lisätä sivuja sovellukseesi, voit käyttää suodatinketju bean asettaakseen turvallisuustasonsa.

Kevään turvallisuuden tärkein etu

Spring Security antaa sinulle täydellisen hallinnan paitsi siitä, kenellä on pääsy sovellukseesi, myös siihen, minkä tyyppistä käyttöoikeutta käyttäjällä voi olla (käyttäjärooliominaisuuden kautta). Kulunvalvonta on yksi tärkeimmistä yksittäisistä ominaisuuksista kaikissa sovelluksissa. Suodattamattoman pääsyn antaminen yleisille käyttäjille sovellukseesi rajoitettujen pääsynvalvontaesteiden vuoksi saattaa osoittautua kalliiksi virheeksi.