Zorg voor de veiligheid van uw Spring-applicatie door gebruik te maken van de robuuste functies van het Spring Security-framework.

Het Spring Security-framework beveiligt uw applicatie door middel van authenticatie en autorisatie. In de standaardstatus zorgt Spring Security ervoor dat elk HTTP-verzoekpad (of pagina) in uw applicatie de authenticatie van een enkele wereldwijde gebruiker vereist.

Dit kader is ook uiterst flexibel. Hiermee kunt u aangepaste beveiligingsregels maken voor elk HTTP-verzoekpad in uw toepassing, evenals voor de verschillende gebruikers. U kunt dus de beveiligingsbeperking verwijderen op pagina's waarvoor geen gebruikersautorisatie is vereist (zoals een startpagina). En stel de rollen en bevoegdheden van specifieke gebruikerstypen in.

Spring Security toevoegen aan uw toepassing

Er zijn twee manieren om Spring Security aan uw applicatie toe te voegen. U kunt het selecteren als een afhankelijkheid bij het genereren van een nieuwe Spring Boot-toepassing met Spring initializr

instagram viewer
, of voeg het toe aan uw buildspecificatiebestand in de afhankelijkheidssectie na het genereren van uw project.

Als u een van de Gradle-projectopties hebt geselecteerd, is het afhankelijkhedenbestand dat bouw.gradle. Als u echter voor Maven kiest, dan is dat bestand dat wel pom.xml.

Jouw bouw.gradle bestand moet de volgende afhankelijkheid bevatten:

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

Terwijl je pom.xml bestand moet de volgende afhankelijkheid bevatten:


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

De voorbeeldtoepassing die in het artikel wordt gebruikt, is hierin beschikbaar GitHub-opslagplaats en is gratis voor u om te gebruiken onder de MIT-licentie.

Springbeveiliging gebruiken

Zodra u de Spring Security-afhankelijkheid aan uw toepassing hebt toegevoegd, kunt u het framework onmiddellijk gaan gebruiken. Voer gewoon uw applicatie uit en navigeer vervolgens naar de startpagina van Spring Boot (of een andere pagina in uw applicatie). De voorbeeldtoepassing gebruikt de volgende initiële controller om de standaardinstelling van Spring Boot te regelen lokale host: 8080 verzoek:

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

Als u uw toepassing uitvoert na het toevoegen van de bovenstaande enkele controllerklasse, wordt de volgende eerste weergave gegenereerd:

U zult merken dat het u automatisch naar de localhost: 8080/login pagina, en het doet dit voordat u toegang krijgt tot een andere pagina van de toepassing. In dit stadium moet u de standaard gebruikersnaam (de gebruiker) en het automatisch gegenereerde wachtwoord (dat u in de console vindt) opgeven. De console genereert een regel zoals de volgende:

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

Elke keer dat u uw applicatie herstart, verandert het automatisch gegenereerde wachtwoord, maar de gebruikersnaam blijft hetzelfde. Als u de standaard gebruikersnaam en het standaardwachtwoord invoert, wordt u naar de juiste weergave in uw toepassing geleid.

Veerbeveiliging aanpassen

Om uw applicatiebeveiliging aan te passen, moet u de standaardconfiguratie van Spring Security overschrijven. Maar daarvoor (ervan uitgaande dat je al Spring Web hebt) heb je verschillende andere afhankelijkheden nodig voor deze voorbeeldtoepassing:

  • Lente gegevens JPA
  • MySQL JDBC-stuurprogramma
  • Tijmblad
  • Lombok

Het Thymeleaf-framework zal verschillende weergaven genereren. Lombok helpt de code in uw objectklassen te verminderen. Met de JPA-bibliotheek en het MySQL-stuurprogramma kunt u een MySQL-database gebruiken met de toepassing, maar u heeft wel de mogelijkheid om elke database te gebruiken waarmee u vertrouwd bent. Het gebruik van een database betekent het configureren van de toepassingen.eigenschappen bestand onder het bronnenbestand.

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

Met de bovenstaande configuratiecode kunt u verbinding maken met een lokale MySQL-database genaamd lente_beveiliging, met gebruikersnaam van wortel, en wachtwoord (1234). U moet deze gegevens bijwerken zodat ze overeenkomen met uw databasenaam en inloggegevens.

Nadat u uw aanvullende afhankelijkheden hebt toegevoegd en uw database hebt gemaakt, kunt u beginnen te beslissen hoeveel weergaven uw toepassing zal hebben. U moet ook weten hoe de beveiliging voor elke pagina eruitziet. Onze voorbeeldtoepassing heeft 6 weergaven:

  • Startpagina
  • Registratie pagina
  • Login pagina
  • Uitlogpagina
  • Gebruikerspagina
  • Foutpagina

De enige weergave waarvoor gebruikersautorisatie vereist is, is de gebruikerspagina. Deze pagina is alleen toegankelijk voor gebruikers die zich eerst registreren en zich vervolgens aanmelden bij de applicatie. Naast het standaardpakket van Spring Boot, moet u vier andere pakketten in uw toepassing maken.

De Registratiecontroller-klasse

Het controllerpakket bevat de klassen die HTTP-verzoeken afhandelen. Afhankelijk van de functie van een pagina kunt u meestal elk HTTP-verzoek groeperen in één controllerklasse, zoals het geval is met de WebController klas. De registratieweergave heeft echter meer unieke functies en kan dus een privécontrollerklasse hebben:

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

De RegistratieController class is een toegangspoort tot het beveiligingsaspect van uw toepassing. De @RequestMapping annotatie specificeert het type verzoek dat deze controller zal afhandelen (verzoeken aan localhost: 8080/register).

De @GetMapping annotatie geeft eenvoudig aan dat als de toepassing een verzoek om /register, de registratieformulier() methode zou dat verzoek moeten afhandelen door de registratieweergave te retourneren.

Nadat een bezoeker op de knop Registreren heeft geklikt, wordt de @PostMapping annotatie speelt een rol. De procesRegistratie() methode kunt u de gebruikersgegevens posten die het krijgt van de Registratieformulier klasse naar de database, met behulp van de Gebruikersrepository klas. Maar voordat het deze gegevens opslaat, moet het procesRegistratie() methode versleutelt het wachtwoord van de gebruiker met behulp van De lenteWachtwoordEncoder koppel.

Nieuwe beveiligingsconfiguraties maken

Sinds Spring 3.1 kunnen ontwikkelaars nu configuraties voor Spring Security maken met behulp van Java, wat klassen betekent in plaats van XML. Het belangrijkste dat deze configuratieklassen nodig hebben, is de @Configuratie annotatie.

@Configuration
publicclassSecurityConfiguration{
}

De @Configuratie annotatie geeft aan dat de klasse hierboven een configuratieklasse is. Deze klassen leveren bonen aan de Lente toepassingscontext, een container die Spring gebruikt om de verschillende componenten (of bonen) van een applicatie te maken en te beheren. De eerste boon in de Beveiligingsconfiguratie klasse is de wachtwoordEncoder Boon.

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

De RegistratieController klas gebruikt de wachtwoordEncoder bean om nieuwe wachtwoorden te coderen voordat ze in de database worden opgeslagen. Een andere belangrijke boon die je moet toevoegen aan de Beveiligingsconfiguratie klasse is de userDetailsService Boon.

@Bean
public UserDetailsService userDetailsService(UserRepository userRepo){
 return username -> {
Customer customer = userRepo.findByUsername(username);
if (customer != null)
return customer;
thrownew UsernameNotFoundException("Customer '" + username + "' not found");
 };
}

De userDetailsService boon gebruikt Lente BeveiligingUserDetailsService interface om de gebruikersnaam en het wachtwoord van een gebruiker op te halen voor authenticatie tijdens de inlogsessie van een klant. Dus zodra een klant op de inlogknop in de inlogweergave klikt, wordt het userDetailsService boon komt in beweging.

Door het Gebruikersrepository, de userDetailsService bean krijgt toegang tot alle bestaande klanten in de database. Deze interface maakt dan gebruik van de Gebruikersrepository om een ​​gebruiker te lokaliseren met een overeenkomende gebruikersnaam en wachtwoord, en retourneert vervolgens alle kenmerken van deze klant als een object.

Als het geretourneerde object een klant is, krijgt deze klant toegang tot de applicatie. Anders wordt de pagina automatisch vernieuwd, zodat de gebruiker geldige inloggegevens kan invoeren.

De filterketen

Lente BeveiligingBeveiligingFilterChain interface is handig applicatie-programmeerinterface (API) die een essentiële rol speelt in de configuratie van Spring Security. Deze interface werkt met Lente BeveiligingHttp-beveiliging class om een ​​filterketen te maken voor specifieke HTTP-verzoeken.

@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();
}

De filterketting bean hierboven gebruikt de BeveiligingFilterChain API om verschillende taken uit te voeren. Ten eerste gebruikt het de Http-beveiliging class om te dicteren dat alleen gebruikers met de rol van GEBRUIKER toegang hebben localhost: 8080/gebruiker. En een gebruiker krijgt deze rol na registratie, dankzij de getAuthorities() methode die elk nieuw klantobject implementeert.

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

De filterketen staat ongeauthenticeerde toegang toe tot alle andere URL's in de applicatie. De filterketting bean maakt ook gebruik van de formulierInloggen() En uitloggen() methoden van de Http-beveiliging klasse object.

Met deze methoden kunt u een gebruiker automatisch naar specifieke pagina's leiden nadat deze een taak heeft uitgevoerd. Dus een gebruiker die de juiste inloggegevens invoert en op de inlogknop op de /login pagina wordt automatisch doorgestuurd naar de /user bladzijde.

eindelijk, de filterketting bean bouwt en retourneert de filterketen, waarmee geautoriseerde gebruikers toegang hebben tot de applicatie. Alle drie de bonen in de Beveiligingsconfiguratie class samenwerken om uw applicatie te beveiligen.

echter, de filterketting bean speelt de belangrijkere rol bij het dicteren van het autorisatieniveau voor elk HTTP-verzoek. Naarmate u meer pagina's aan uw toepassing begint toe te voegen, kunt u de filterketting bean om hun beveiligingsniveau in te stellen.

Het grote voordeel van voorjaarsbeveiliging

Spring Security geeft u volledige controle over niet alleen wie toegang heeft tot uw applicatie, maar ook over het type toegang dat een gebruiker kan hebben (via de functie voor gebruikersrollen). Toegangscontrole is een van de belangrijkste aspecten van elke toepassing. Algemene gebruikers ongefilterde toegang geven tot uw applicatie vanwege beperkte toegangscontrolebarrières kan een kostbare vergissing blijken te zijn.