Spring Boot Security – API REST sécurisée
Dans cet article, nous allons apprendre à sécuriser l’API REST en utilisant l’authentification de base (Basic Authentication) de Spring Boot Security. Avec la sécurité en place, notre application fournira les données à l’utilisateur qui est authentifié par l’authentification de base.
Afin d’accéder à une ressource sécurisée, l’utilisateur doit faire la demande à notre API avec les informations d’en-tête contenant le nom d’utilisateur et le mot de passe pour accéder à la ressource.
Créer un projet Spring Boot « SecurityBasicAuth »
Structure du projet
Créez votre projet en utilisant le site officiel : https://start.spring.io/
Le fichier pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>net.autourducode</groupId>
<artifactId>SecurityBasicAuth</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SecurityBasicAuth</name>
<description>SecurityBasicAuth</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Le spring-boot-starter-parent est un starter spécial, il fournit des valeurs par défaut Maven utiles. Puisque nous développons une application web, nous devons également ajouter la dépendance spring-boot-starter-web, qui ajoutera les dépendances telles que Tomcat, Jackson, Spring boot, etc. qui sont nécessaires à notre application. La dépendance spring-boot-starter-security ajoute toutes les dépendances liées à la sécurité.
Le diagramme de dépendances
Configuration de la sécurité de Spring Boot
SecurityConfig.java
package net.autourducode.securitybasicauth;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
/**
* @author autourducode
*/
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.httpBasic().and().authorizeRequests()
.antMatchers("/user").hasRole("USER")
.antMatchers("/admin").hasRole("ADMIN")
.and()
.csrf().disable();
return http.build();
}
@Bean
public InMemoryUserDetailsManager userDetailsService() {
UserDetails user = User.builder()
.username("user")
.password(passwordEncoder().encode("password"))
.roles("USER")
.build();
UserDetails admin = User.builder()
.username("admin")
.password(passwordEncoder().encode("password"))
.roles("USER", "ADMIN")
.build();
return new InMemoryUserDetailsManager(admin, user);
}
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
return (web) -> web.ignoring().antMatchers("/images/**", "/js/**", "/webjars/**");
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Pour encourager les utilisateurs à s’orienter vers une configuration de la sécurité basée sur les composants, vous devez maintenant déclarer deux beans de type SecurityFilterChain et WebSecurityCustomizer. Plus d’informations dans cet article Spring Security – WebSecurityConfigurerAdapter déprécié !
Le contrôleur
SecureController.java
package net.autourducode.securitybasicauth;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author autourducode
*/
@RestController
public class SecureController {
@GetMapping("/user")
public String loginUser()
{
return "L'utilisateur s'est connecté avec succès !!!";
}
@GetMapping("/admin")
public String loginAdmin()
{
return "L'administrateur s'est connecté avec succès !!!";
}
}
- Nous avons annoté notre classe « SecureController » avec @RestController. L’annotation @RestController a été introduite dans Spring 4 et est une combinaison de @Controller + @ResponseBody. Ainsi, lorsque vous utilisez @RestController, vous n’avez pas besoin d’utiliser @ResponseBody qui est désormais optionnel.
- Nous avons deux méthodes
- loginUser() → Cette méthode sera appelée lorsque la requête avec la methode GET est /user
- loginAdmin() → Cette méthode sera appelée lorsque la requête avec la methode GET est /admin
Dans POSTMAN, sélectionnez la méthode GET et donnez l’url comme « http://localhost:8080/user« . Dans l’onglet Autorisation, sélectionnez le type « Basic Auth » et entrez le nom d’utilisateur/mot de passe invalide. Vous obtiendrez l’erreur 401 Unauthorized
Maintenant, passez le nom d’utilisateur et le mot de passe valides [user/password (ou) admin/password].
Télécharger le code source
J’espère que cet article vous a été utile. Merci de l’avoir lu.
Retrouvez nos vidéos #autourducode sur notre chaîne YouTube : https://bit.ly/3IwIK04
נערות ליווי אילת
I must thank you for the efforts you have put in writing this blog. Im hoping to check out the same high-grade blog posts from you in the future as well. In fact, your creative writing abilities has encouraged me to get my own, personal site now 😉
admin
Thank 🤝
Gomis
Merci pour le contenu , c’est top!