Sørg for sikkerheden af ​​din Spring-applikation ved at udnytte de robuste funktioner, der tilbydes af Spring Security-rammen.

Spring Security-rammen sikrer din applikation gennem godkendelse og autorisation. I standardtilstanden sikrer Spring Security, at hver HTTP-anmodningssti (eller side) i din applikation kræver godkendelse af en enkelt global bruger.

Denne ramme er også yderst fleksibel. Det giver dig mulighed for at oprette tilpassede sikkerhedsregler for hver HTTP-anmodningssti i din applikation såvel som de forskellige brugere. Så du kan fjerne sikkerhedsbegrænsningen på sider, der ikke kræver brugerautorisation (såsom en startside). Og indstil roller og autoriteter for specifikke brugertyper.

Tilføjelse af Spring Security til din applikation

Der er to måder at tilføje Spring Security til din applikation. Du kan enten vælge det som en afhængighed, når du genererer en ny Spring Boot-applikation ved hjælp af Spring initializr, eller tilføj det til din byggespecifikationsfil i afhængighedsafsnittet efter generering af dit projekt.

instagram viewer

Hvis du valgte en af ​​Gradle-projektmulighederne, så er afhængighedsfilen bygge.gradle. Men hvis du valgte Maven, så er den fil det pom.xml.

Din bygge.gradle fil skal indeholde følgende afhængighed:

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

Mens din pom.xml fil skal indeholde følgende afhængighed:


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

Eksempelapplikationen brugt i artiklen er tilgængelig i denne GitHub-depot og er gratis for dig at bruge under MIT-licensen.

Brug af Spring Security

Når du har tilføjet Spring Security-afhængigheden til din applikation, kan du begynde at bruge rammen med det samme. Du skal blot udføre din applikation og derefter navigere til Spring Boots hjemmeside (eller en hvilken som helst side i din applikation). Eksempelapplikationen bruger følgende indledende controller til at styre Spring Boots standard lokal vært: 8080 anmodning:

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

Udførelse af din applikation efter tilføjelse af den enkelte controller-klasse ovenfor genererer følgende indledende visning:

Du vil bemærke, at den automatisk leder dig til localhost: 8080/login side, og den gør dette, før den giver dig adgang til en anden side i applikationen. På dette tidspunkt skal du angive standardbrugernavnet (som er brugeren) og den automatisk genererede adgangskode (som du finder i konsollen). Konsollen genererer en linje som følgende:

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

Hver gang du genstarter din applikation, ændres den automatisk genererede adgangskode, men brugernavnet forbliver det samme. Indtastning af standardbrugernavn og -adgangskode fører dig til den relevante visning i din applikation.

Tilpasning af Spring Security

For at tilpasse din applikationssikkerhed skal du tilsidesætte Spring Securitys standardkonfiguration. Men før det (forudsat at du allerede har Spring Web) har du brug for flere andre afhængigheder til denne eksempelapplikation:

  • Spring Data JPA
  • MySQL JDBC-driver
  • Timianblad
  • Lombok

Thymeleaf-rammen vil generere forskellige synspunkter. Lombok vil hjælpe med at reducere koden i dine objektklasser. JPA-biblioteket og MySQL-driveren giver dig mulighed for at bruge en MySQL-database med applikationen, men du har mulighed for at bruge enhver database, som du er fortrolig med. Brug af en database betyder at konfigurere applikationer.egenskaber fil under ressourcefilen.

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

Konfigurationskoden ovenfor giver dig mulighed for at oprette forbindelse til en lokal MySQL-database kaldet spring_sikkerhed, med et brugernavn på rod, og adgangskode (1234). Du skal opdatere disse data, så de matcher dit databasenavn og dine legitimationsoplysninger.

Når du har tilføjet dine yderligere afhængigheder og oprettet din database, kan du begynde at beslutte, hvor mange visninger din applikation vil have. Du skal også vide, hvordan sikkerheden for hver side ser ud. Vores eksempelapplikation har 6 visninger:

  • Hjemmeside
  • Tilmeldingsside
  • Login side
  • Logout side
  • Brugerside
  • Fejlside

Den eneste visning, der kræver brugerautorisation, er brugersiden. Denne side er kun tilgængelig for brugere, der først registrerer sig og derefter logger ind på applikationen. Ud over Spring Boots standardpakke skal du oprette fire andre pakker i din applikation.

Registreringsansvarlig-klassen

Controllerpakken vil indeholde de klasser, der håndterer HTTP-anmodninger. Afhængigt af funktionen af ​​en side kan du normalt gruppere hver HTTP-anmodning i en controllerklasse, som det er tilfældet med WebController klasse. Registreringsvisningen har dog flere unikke funktioner, så den kan have en privat controller-klasse:

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

Det RegistrationController klasse er en gateway til sikkerhedsaspektet af din applikation. Det @RequestMapping annotation specificerer den type anmodning, som denne controller vil håndtere (anmodninger om localhost: 8080/register).

Det @GetMapping anmærkning angiver blot, at hvis ansøgningen modtager en anmodning om /register, det tilmeldingsblanket() metoden skal håndtere denne anmodning ved at returnere registreringsvisningen.

Når en besøgende har klikket på tilmeld-knappen, derefter @PostMapping annotation kommer i spil. Det processRegistration() metode giver dig mulighed for at sende de brugerdata, den får fra Tilmeldingsblanket klasse til databasen ved hjælp af UserRepository klasse. Men før den gemmer disse data, processRegistration() metode krypterer brugerens adgangskode ved hjælp af foråretsPasswordEncoder interface.

Oprettelse af nye sikkerhedskonfigurationer

Siden Spring 3.1 kan udviklere nu oprette konfigurationer til Spring Security ved hjælp af Java, hvilket betyder klasser i stedet for XML. Det vigtigste, som disse konfigurationsklasser kræver, er @Konfiguration anmærkning.

@Configuration
publicclassSecurityConfiguration{
}

Det @Konfiguration annotation angiver, at klassen ovenfor er en konfigurationsklasse. Disse klasser giver bønner til Forårsansøgningskontekst, som er en beholder, som Spring bruger til at skabe og administrere de forskellige komponenter (eller bønner) i en applikation. Den første bønne i Sikkerhedskonfiguration klasse er passwordEncoder bønne.

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

Det RegistrationController klasse bruger passwordEncoder bean for at indkode nye adgangskoder, før du gemmer dem i databasen. En anden vigtig bønne, som du bliver nødt til at tilføje til Sikkerhedskonfiguration klasse er userDetailsService bønne.

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

Det userDetailsService bean beskæftiger ForårssikkerhedUserDetailsService interface til at hente en brugers brugernavn og adgangskode til godkendelse under en kundes login-session. Så snart en kunde klikker på login-knappen i login-visningen, vil den userDetailsService bønne springer i bevægelse.

Gennem UserRepository, det userDetailsService bean får adgang til alle eksisterende kunder i databasen. Denne grænseflade bruger derefter UserRepository for at finde en bruger med et matchende brugernavn og adgangskode, returnerer derefter alle denne kundes attributter som et objekt.

Hvis det returnerede objekt er en kunde, så får denne kunde adgang til applikationen. Ellers vil siden automatisk blive opdateret, så brugeren kan indtaste gyldige legitimationsoplysninger.

Filterkæden

ForårssikkerhedSecurityFilterChain interface er en nyttig Application Programming Interface (API) der spiller en væsentlig rolle i Spring Security-konfigurationen. Denne grænseflade fungerer med ForårssikkerhedHttpSikkerhed klasse for at oprette en filterkæde til specifikke HTTP-anmodninger.

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

Det filterKæde bean ovenfor bruger SecurityFilterChain API til at udføre flere opgaver. For det første bruger den HttpSikkerhed klasse for at diktere, at kun brugere, der har rollen som en BRUGER, kan få adgang localhost: 8080/bruger. Og en bruger får denne rolle efter registrering, takket være getAuthorities() metode, som hvert nyt kundeobjekt implementerer.

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

Filterkæden tillader uautoriseret adgang til alle andre URL'er i applikationen. Det filterKæde bean bruger også formLogin() og Log ud() metoder til HttpSikkerhed klasseobjekt.

Disse metoder giver dig mulighed for automatisk at dirigere en bruger til bestemte sider, efter at de har udført en opgave. Så en bruger, der indtaster de korrekte legitimationsoplysninger og klikker på login-knappen på /login siden vil automatisk blive dirigeret til /user side.

Endelig filterKæde bean bygger og returnerer filterkæden, som giver autoriserede brugere adgang til applikationen. Alle tre bønner i Sikkerhedskonfiguration klasse arbejde sammen for at sikre din ansøgning.

Imidlertid filterKæde bean spiller den mere væsentlige rolle ved at diktere autorisationsniveauet for hver HTTP-anmodning. Når du begynder at tilføje flere sider til din applikation, kan du bruge filterKæde bean for at indstille deres sikkerhedsniveau.

Den største fordel ved Spring Security

Spring Security giver dig fuld kontrol over ikke kun, hvem der har adgang til din applikation, men også den type adgang, en bruger kan have (via dens brugerrollefunktion). Adgangskontrol er et af de vigtigste aspekter af enhver applikation. At give almindelige brugere ufiltreret adgang til din applikation på grund af begrænsede adgangskontrolbarrierer kan vise sig at være en dyr fejl.