27 juillet 2022 Java Spring Boot

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

Diagramme de dépendances du projet

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

    08.01.22 à 20 h 40 min

    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
      08.02.22 à 0 h 19 min

      Thank 🤝

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.