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