0% ont trouvé ce document utile (0 vote)
0 vues56 pages

Chap3 Spring Web

Ce document présente une introduction au framework Spring Boot pour le développement d'applications web en Java, en détaillant ses fonctionnalités telles que l'auto-configuration et la création d'API REST. Il aborde également des concepts clés comme la gestion des requêtes et des réponses, l'authentification, le contrôle d'accès avec Spring Security, et la validation des saisies utilisateur. Enfin, il fournit des exemples de code pour illustrer l'utilisation des différentes fonctionnalités de Spring Web.

Transféré par

ismailasouane08
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
0 vues56 pages

Chap3 Spring Web

Ce document présente une introduction au framework Spring Boot pour le développement d'applications web en Java, en détaillant ses fonctionnalités telles que l'auto-configuration et la création d'API REST. Il aborde également des concepts clés comme la gestion des requêtes et des réponses, l'authentification, le contrôle d'accès avec Spring Security, et la validation des saisies utilisateur. Enfin, il fournit des exemples de code pour illustrer l'utilisation des différentes fonctionnalités de Spring Web.

Transféré par

ismailasouane08
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Spring Web

Ahmad Khoureich Ka

Université Alioune Diop

Master SI

Ahmad Khoureich Ka (UADB) Spring Web Master SI 1 / 56


Sommaire

1 Introduction

2 Paramètres d’initialisation

3 La requête, la réponse et la session

4 Authentification et contrôle d’accès

5 Validation de la saisie

6 REST API ?

7 API REST avec Spring Boot

Ahmad Khoureich Ka (UADB) Spring Web Master SI 2 / 56


Introduction

Spring Boot ?

☞ Spring boot est un framework de développment d’applications en JAVA.

☞ Met en oeuvre la méthode RAD (Rapid Application Development)

☞ Fournit les librairies pour :


le developpment web,
l’accès aux bases de doonnées,
la sécurité, ...

☞ Gère automatiquement la configuration de votre application (auto-configuration)

☞ Produit des applications prètes à être mises en production (packager en JAR


embarquant un serveur web)

Ahmad Khoureich Ka (UADB) Spring Web Master SI 3 / 56


Introduction

Création d’applications Web et RESTful


Dépendance Maven

☞ Dépendance spring-boot-starter-web
<dependency>
<groupId>[Link]</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

☞ Intègre par défaut le serveur Apache Tomcat.

Ahmad Khoureich Ka (UADB) Spring Web Master SI 4 / 56


Paramètres d’initialisation

Paramètres d’initialisation

☞ Propriétés externalisées définies dans [Link]

☞ Injectable avec @Value

// [Link]
[Link]=jdbc:mysql://localhost:3306/mydb

@Component
public class UnComponent {
@Value("${[Link]}")
private String dbUrl;
}

Ahmad Khoureich Ka (UADB) Spring Web Master SI 5 / 56


La requête, la réponse et la session

Récupération des paramètres de requêtes → @RequestParam

@RequestMapping("/parametre")
public String affichage( @RequestParam String nom ) {
[Link]("param nom : " + nom);
return "index";
}

@RequestMapping("/parametre")
public String affichage( @RequestParam(required = false,
defaultValue = "modou") String nom ) {
[Link]("param nom : " + nom);
return "index";
}

Ahmad Khoureich Ka (UADB) Spring Web Master SI 6 / 56


La requête, la réponse et la session

Paramètre multi-valués → @RequestParam

@RequestMapping("/multivalue")
public String somme(@RequestParam List<Integer> nombres) {
int somme = 0;
for(int n : nombres){
somme += n;
}
[Link]("Somme des nombres saisis : " + somme);
return "index";
}

Ahmad Khoureich Ka (UADB) Spring Web Master SI 7 / 56


La requête, la réponse et la session

Tous les paramètres contenus dans la requête → @RequestParam

@RequestMapping("/req/param")
public String affichage(@RequestParam Map<String,String> tousLesParams) {
[Link]("Tous les params : " + tousLesParams);
return "index";
}

Ahmad Khoureich Ka (UADB) Spring Web Master SI 8 / 56


La requête, la réponse et la session

Récupérer un fichier attaché → @RequestParam


<form action="/save" method="POST" enctype="multipart/form-data">
Photo: <input type="file" name="photo" />
...
</form>

import [Link];
...

@RequestMapping("/save")
public String enregistrer(@RequestParam MultipartFile photo) {
InputStream is = [Link]();
String nomFichier = [Link]();
...
}

Ahmad Khoureich Ka (UADB) Spring Web Master SI 9 / 56


La requête, la réponse et la session

Les informations sur le client → HttpServletRequest

Les informations sur le client :


adresse ip
nom complet (FQDN)
type d’authentification utilisé
...

@RequestMapping("/client")
public String client(HttpServletRequest request) {
[Link]("adresse ip: " + [Link]());
return "index";
}

Ahmad Khoureich Ka (UADB) Spring Web Master SI 10 / 56


La requête, la réponse et la session

Les en-têtes HTTP de requête → @RequestHeader

@RequestMapping("/header")
public String header(@RequestHeader("Accept-Language") String langues) {
[Link]("préférences de langues: " + langues);
return "index";
}

☞ Les en-têtes HTTP de requête peuvent également être récupérés à l’aide de


HttpServletRequest

Ahmad Khoureich Ka (UADB) Spring Web Master SI 11 / 56


La requête, la réponse et la session

Transfert de requête
☞ Transfert d’un contrôleur à un autre.
// Controleur 1
@RequestMapping("/transfert")
public String transfert(HttpServletRequest request) {
[Link]("username", "modou");
return "forward:/resultat?userId=123";

// Controleur 2
@RequestMapping("/resultat")
public String resultat() {
return "resultat";
}

Ahmad Khoureich Ka (UADB) Spring Web Master SI 12 / 56


La requête, la réponse et la session

Attribut de requête → @RequestAttribute

@RequestMapping("/attribut")
public String attribut(@RequestAttribute int id) {
[Link]("id : " + id);
return "index";
}

Ahmad Khoureich Ka (UADB) Spring Web Master SI 13 / 56


La requête, la réponse et la session

Redirection de requête

☞ Demander au navigateur d’envoyer une nouvelle requête.


@RequestMapping("/redir")
public String redir(RedirectAttributes attr) {
attr
.addAttribute("msg", "bonjour")
.addFlashAttribute("produit", new Produit("PC", 120000));
return "redirect:/page";
}

☞ Les attributs ajoutés avec addAttribute sont des paramètres de requête.


☞ Les attributs ajoutés avec addFlashAttribute sont des attributs requête.

Ahmad Khoureich Ka (UADB) Spring Web Master SI 14 / 56


La requête, la réponse et la session

La réponse → ResponseEntity

☞ ResponseEntity pour définir les différentes parties de la réponse : code de statut,


en-têtes et corps de la réponse.
// Exemple 1
@RequestMapping("/message")
public ResponseEntity<String> message() {
return [Link]("message");
}

// Exemple 2
@RequestMapping("/erreur")
public ResponseEntity<String> erreur() {
return [Link]([Link]).body("Accès refusé!");
}

Ahmad Khoureich Ka (UADB) Spring Web Master SI 15 / 56


La requête, la réponse et la session

La réponse → ResponseEntity

// Exemple 3
@RequestMapping("/redir")
public ResponseEntity<String> redir() {
return ResponseEntity
.status([Link])
.header("Refresh", "5;URL=/nouvellePage")
.body("Vous serez redirigé vers la page demandée.");
}

Ahmad Khoureich Ka (UADB) Spring Web Master SI 16 / 56


La requête, la réponse et la session

Les cookies : création → HttpServletResponse

@RequestMapping("/cookie")
public String ajouterCookie(HttpServletResponse response) {
Cookie c = new Cookie("userId", "u235");
[Link](2592000);
[Link]("/");
[Link](true);
[Link](c);
return "index";
}

Ahmad Khoureich Ka (UADB) Spring Web Master SI 17 / 56


La requête, la réponse et la session

Les cookies : récupération → @CookieValue

@RequestMapping("/cookie")
public String cookie(@CookieValue(value="userId",defaultValue="0") String uid) {
[Link]("userId : " + uid);
return "index";
}

Ahmad Khoureich Ka (UADB) Spring Web Master SI 18 / 56


La requête, la réponse et la session

La session → HttpSession

@RequestMapping("/deconnexion")
public String deconnexion(HttpSession session) {
[Link]();
return "index";
}

Ahmad Khoureich Ka (UADB) Spring Web Master SI 19 / 56


La requête, la réponse et la session

La session : récupération d’attribut → @SessionAttribute

@RequestMapping("/accueil")
public String accueil(@SessionAttribute String role) {
[Link]("role : " + role);
return "index";
}

Ahmad Khoureich Ka (UADB) Spring Web Master SI 20 / 56


La requête, la réponse et la session

Ajouter un attribut au modèle


[Link]

☞ Model : ajouter des attributs pour la vue.

@RequestMapping("/model")
public String model(Model model) {
[Link]("titre", "Publier une nouvelle annonce");
[Link]("content", "newAnnonce");
return "accueil";
}

Ahmad Khoureich Ka (UADB) Spring Web Master SI 21 / 56


La requête, la réponse et la session

Créer un objet à partir des paramètres de requête


[Link]

☞ @ModelAttribute : ajouter un objet crée à partir de requête pour la vue.


// Exemple 1
@RequestMapping("/ajouterClient")
public String ajouterClient(Client client) {
[Link](client);
return "listeClient";
}

// Exemple 2
@RequestMapping("/ajouterClient")
public String ajouterClient(@ModelAttribute("client") Client client) {
[Link](client);
return "clientAjoute";
}

Ahmad Khoureich Ka (UADB) Spring Web Master SI 22 / 56


Authentification et contrôle d’accès

Authentification et contrôle d’accès : Spring Security

☞ Dépendance spring-boot-starter-security
<dependency>
<groupId>[Link]</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

Ahmad Khoureich Ka (UADB) Spring Web Master SI 23 / 56


Authentification et contrôle d’accès

Contrôle d’accès

☞ Chaîne de filtres de sécurité


Basé sur les URIs

☞ Au niveau méthodes
Utilise les annotations @PreAuthorize et @PostAuthorize

Ahmad Khoureich Ka (UADB) Spring Web Master SI 24 / 56


Authentification et contrôle d’accès

Contrôle d’accès : configurer la chaine de filtre de sécurité


@Configuration
@EnableWebSecurity
public class SecurityConfig {

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) {
[Link]((authorize) -> authorize
.dispatcherTypeMatchers([Link]).permitAll()
.requestMatchers("/","/css/**", "/js/**").permitAll()
.requestMatchers("/u/**").hasAnyRole("USER", "ADMIN")
.requestMatchers("/a/**").hasRole("ADMIN")
.anyRequest().authenticated());

return [Link]();
}
}

Ahmad Khoureich Ka (UADB) Spring Web Master SI 25 / 56


Authentification et contrôle d’accès

Contrôle d’accès → @PreAuthorize et @PostAuthorize


☞ Activer la sécurité au niveau méthode dans la classe principale :

@SpringBootApplication
@EnableMethodSecurity
public class ClassePrincipale { ... }

☞ Au niveau @Controller
@PreAuthorize("hasAnyRole(’USER’, ’ADMIN’)")
@PostAuthorize("[Link] == [Link]")
@RequestMapping("/u/userinfo")
public ResponseEntity<AppUser> userinfo(@RequestParam String username) {
return [Link]([Link](username));
}

Ahmad Khoureich Ka (UADB) Spring Web Master SI 26 / 56


Authentification et contrôle d’accès

Composants essentiels de Spring Security

☞ Authentication : représente l’utilisateur, son mot de passe et ses rôles.


UsernamePasswordAuthenticationToken est une implémentation.

☞ SecurityContext : stocke les informations de l’utilisateur authentifié.

☞ SecurityContextHolder : stocke le SecurityContext sur lequel se base le


contrôle d’accès.

Récupérer l’utilisateur authentifié :


SecurityContext context = [Link]();
User user = (User)[Link]().getPrincipal();

Ahmad Khoureich Ka (UADB) Spring Web Master SI 27 / 56


Authentification et contrôle d’accès

Appliquer des contraintes de sécurité dans les JSP

☞ Dépendance spring-security-taglibs
<dependency>
<groupId>[Link]</groupId>
<artifactId>spring-security-taglibs</artifactId>
</dependency>

☞ Déclarer la bibliothèque de tags


<%@ taglib prefix="sec" uri="[Link] %>

Ahmad Khoureich Ka (UADB) Spring Web Master SI 28 / 56


Authentification et contrôle d’accès

Contraintes de sécurité dans les JSP

☞ Récupérer une propriété de l’utilisateur authentifié :


Nom: <sec:authentication property="name" />

☞ Contrôle d’accès
<sec:authorize access="!isAuthenticated()">
<a href="/login">Se connecter</a>
</sec:authorize>

<sec:authorize access="isAuthenticated()">
<a href="/logout">Se déconnecter</a>
</sec:authorize>

Ahmad Khoureich Ka (UADB) Spring Web Master SI 29 / 56


Authentification et contrôle d’accès

Contraintes de sécurité dans les JSP

☞ Contrôle d’accès basé sur le rôle


<%-- exemple 1 --%>
<sec:authorize access="hasRole('SUPERUSER')">
<a href="/listeUsers">Gérer utilisateurs</a>
</sec:authorize>

<%-- exemple 2 --%>


<sec:authorize access="hasAnyRole('ADMIN','SUPERUSER')">
<a href="/listeUsers">Gérer utilisateurs</a>
</sec:authorize>

Ahmad Khoureich Ka (UADB) Spring Web Master SI 30 / 56


Authentification et contrôle d’accès

Contraintes de sécurité dans les JSP

☞ CSRF (Cross Side Request Forgery)

☞ Le tag csrfInput
Permet d’insérer un champ caché CSRF dans un formulaire

Utile contre les attaques CSRF


<form action="/modifier" method="POST">
<sec:csrfInput />
...
</form>

Ahmad Khoureich Ka (UADB) Spring Web Master SI 31 / 56


Validation de la saisie

Validation de la saisie utilisateur

☞ Vérifier la conformité des données fournies par l’utilisateur avec les contraintes
prédéfinies dans le modèle avant leur traitement.

☞ Avantages :
garantir l’exactitude et l’intégrité des données.

contribuer à la sécurité et à la fiabilité de l’application.

prévenir les accès non autorisés et divers types d’attaques (injection SQL, Cross-Site
Scripting (XSS), etc.).

Ahmad Khoureich Ka (UADB) Spring Web Master SI 32 / 56


Validation de la saisie

Activation de la validation

☞ Dépendance Maven
<dependency>
<groupId>[Link]</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

☞ Annotations de validation de base


@Email, @NotNull, @NotBlank, @Positive, @Negative,
@Min, @Max, @Size, @Past, @Future

Ahmad Khoureich Ka (UADB) Spring Web Master SI 33 / 56


Validation de la saisie

Annotations de validation →
[Link]
public class Client {
@NotBlank
@Size(min = 2, max = 25, message = "{prenom.erreur_size}")
private String prenom;

@NotBlank(message = "{email.erreur_notblank}")
@Email(message = "Email n'est pas valide")
private String email;
}

☞ Messages d’erreur externalisés dans un fichier [Link]


prenom.erreur_size=Prénom doit avoir entre 2 et 25 caractères.
email.erreur_notblank=Email est obligatoire.

Ahmad Khoureich Ka (UADB) Spring Web Master SI 34 / 56


Validation de la saisie

Déclencher la validation automatique → @Valid

☞ Pour valider les champs à l’intérieur de l’objet

// 1
@Valid
@Size(max = 3, message = "vous pouvez définir au maximum 3 rôles.")
List<@NotBlank(message = "Le rôle ne peut pas être vide.") String> roles;

// 2
public String ajouterUser(@Valid User user) {
...
return "listeUser";
}

☞ Lorsque la validation échoue une exception


MethodArgumentNotValidException est lancée.

Ahmad Khoureich Ka (UADB) Spring Web Master SI 35 / 56


Validation de la saisie

Déclencher la validation automatique → @Validated

☞ Pour valider les paramètres de requête


☞ Annoter la classe du contrôleur avec @Validated

public String ajouterAchat(


@RequestParam @Size(min = 5, max = 5, message = "{err_size}") String codeProd,
@RequestParam @Positive(message = "{err_positive}") int qte) {
...
return "listeAchat";
}

☞ Lorsque la validation échoue une exception ConstraintViolationException


est lancée.

Ahmad Khoureich Ka (UADB) Spring Web Master SI 36 / 56


Validation de la saisie

Gestion des erreurs de validation → @ControllerAdvice


@ExceptionHandler([Link])
public String GererErreurValidation( MethodArgumentNotValidException ex,
Model model) {
List<String> erreurs = [Link]().stream()
.map(err -> [Link]()).toList();
[Link]("erreurs", erreurs);
return "erreur";
}

@ExceptionHandler([Link])
public String handleConstraintViolation( ConstraintViolationException ex,
Model model) {
List<String> erreurs = [Link]().stream()
.map(v -> [Link]()).toList();
[Link]("erreurs", erreurs);
return "erreur";
}

Ahmad Khoureich Ka (UADB) Spring Web Master SI 37 / 56


REST API ?

REST API ?

☞ REST acronyme de REpresentational State Transfer.

☞ Une API basée sur HTTP. JSON ou XML comme format de données dans les
requêtes et les réponses.

☞ Le client envoie une requête (URI, en-têtes et corps au format JSON ou XML).

☞ Le serveur retourne une réponse (code de statut, en-têtes et corps au format JSON
ou XML).

☞ Permettre à deux applications de communiquer entre elles via le protocole HTTP.

. Thèse de doctorat de Dr Roy Fielding en 2000


Ahmad Khoureich Ka (UADB) Spring Web Master SI 38 / 56
REST API ?

API RESTful → six contraintes fondamentales


☞ Interface uniforme
Le serveur présente la même interface d’interaction quelque soit le client (indépendamment de
leur langage).

☞ Séparation client-serveur
le client et le serveur doivent être totalement indépendants.

☞ Sans état (Stateless)


la requête doit contenir toutes les informations nécessaire à son traitement.

☞ Mise en cache
les réponses peuvent être mises en cache au niveau du client pour réduire la charge du serveur.

☞ Système multicouche
séparer les préoccupations : interface utilisateur, logique métier, accès aux données, etc.

☞ Code à la demande (optionnel)


fournir (à la demande) au client du code de traitement.
Ahmad Khoureich Ka (UADB) Spring Web Master SI 39 / 56
REST API ?

Méthodes HTTP pour les requêtes

☞ Cinq méthodes HTTP :

GET : Récupère une ressource ou une collection de ressources.

POST : Crée une nouvelle ressource.

PUT : Met à jour entièrement une ressource en la remplaçant par une nouvelle.

PATCH : Met à jour partiellement une ressource.

DELETE : Supprime une ressource.

Ahmad Khoureich Ka (UADB) Spring Web Master SI 40 / 56


REST API ?

Conventions de dénomination des URIs

☞ Utilisez des noms pour représenter des ressources.

☞ Utilisez le pluriel pour les collections de ressource :


GET /[Link]/users
GET /[Link]/clients/854/factures/12/ligneCmds/3

☞ Utilisez des lettres minuscules dans les URI, séparer les mots par des tirets (-).

☞ Préférez les URL courtes : clients au lieu de client-liste

Ahmad Khoureich Ka (UADB) Spring Web Master SI 41 / 56


API REST avec Spring Boot

API REST avec Spring Boot → @RestController

☞ Créer une application Spring Boot

☞ Dépendance spring-boot-starter-web
<dependency>
<groupId>[Link]</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

☞ Ajouter une classe annotée @RestController

Ahmad Khoureich Ka (UADB) Spring Web Master SI 42 / 56


API REST avec Spring Boot

API REST end-point


☞ Les end-points de la classe @RestController sont annotées avec une des
méthodes HTTP : @GetMapping, @PostMapping, @PutMapping,
@PatchMapping ou @DeleteMapping.

@GetMapping("/clients")
public List<Client> getClients(){ ... }

@GetMapping(value = "/clients/{id}")
public Client getClient(@PathVariable("id") String id){ ... }

@PostMapping(path = "/clients")
public Client addClient(@RequestBody Client client){ ... }

Ahmad Khoureich Ka (UADB) Spring Web Master SI 43 / 56


API REST avec Spring Boot

Tester votre API

☞ Swagger (OpenAPI)
framework pour concevoir, créer et documenter des API RESTful.

☞ Plateformes pour concevoir, tester et collaborer sur des API :


Postman
Insomnia

Ahmad Khoureich Ka (UADB) Spring Web Master SI 44 / 56


API REST avec Spring Boot

Swagger (OpenAPI)

☞ Swagger est un ensemble d’outils qui implémentent la Spécification OpenAPI (OAS).

☞ Dépendance springdoc-openapi-starter-webmvc-ui
<dependency>
<groupId>[Link]</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>...</version>
</dependency>

☞ Autoriser Swagger pour Spring Security


requestMatchers("/swagger-ui/**", "/v3/api-docs/**").permitAll()

☞ Interface Swagger
[Link]

Ahmad Khoureich Ka (UADB) Spring Web Master SI 45 / 56


API REST avec Spring Boot

Spécification de type de média → consumes, produces


☞ Spécification au niveau du contrôleur
@RestController
@RequestMapping(path = "/[Link]",
produces = MediaType.APPLICATION_JSON_VALUE)
public class AppController {
...
}

☞ Spécification au niveau de la méthode


@PostMapping(path = "/clients",
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Client> addClient(@RequestBody Client client){
...
}

Ahmad Khoureich Ka (UADB) Spring Web Master SI 46 / 56


API REST avec Spring Boot

CORS (Cross-Origin Resource Sharing)


☞ Autoriser les requêtes ayant une origine différente (domaine, protocole ou port) de
celles du serveur API.

Configuration au niveau du contrôleur


@CrossOrigin(origins = "[Link]
@RestController
public class AppController {
...
}

Configuration au niveau de la méthode :


@CrossOrigin
@PostMapping("/clients")
public Client addClient(@RequestBody Client client){
...
}

Ahmad Khoureich Ka (UADB) Spring Web Master SI 47 / 56


API REST avec Spring Boot

Attributs de @CrossOrigin

origins : liste des origines autorisées. Par défaut, "*".


allowedHeaders : liste des en-têtes de requête autorisées. Par défaut, "*".
methods : liste des méthodes HTTP autorisées. Par défaut, toutes les combinaisons
méthodes et URIs définies dans le contrôleur.
exposedHeaders : liste des en-têtes de réponse autorisés à être présentés par le
navigateur. Par défaut aucun.
allowCredentials : autoriser ou non le navigateur à inclure les cookies et les
en-têtes d’authentification dans la requête. Par défaut false.
maxAge : durée (en secondes) de mise en cache de la réponse (autorisant ou non
les requêtes d’origine croisée) de contrôle en amont . Par défaut 1800 s (30 mn).

Ahmad Khoureich Ka (UADB) Spring Web Master SI 48 / 56


API REST avec Spring Boot

Configuration globale de CORS → WebMvcConfigurer


☞ Redéfinir addCorsMappings de WebMvcConfigurer dans une classe de
configuration :
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
[Link]("/api/v1/**")
.allowedOrigins("[Link]
.allowedMethods("*")
.allowedHeaders("header1", "header2", "header3")
.exposedHeaders("header1", "header2")
.maxAge(3600);
}
}

Ahmad Khoureich Ka (UADB) Spring Web Master SI 49 / 56


API REST avec Spring Boot

JWT (JSON Web Token)

☞ Jeton signé pouvant contenir une identité ou un ensemble de permissions.

☞ JWT est généralement utilisé pour l’authentification et l’autorisation sans recourir à la


session.

☞ Le jeton JWT se compose de trois parties (encodées en base64url) :


en-tête + "." + charge utile + "." + signature

. [Link]
. RFC 7519, RFC 6750
Ahmad Khoureich Ka (UADB) Spring Web Master SI 50 / 56
API REST avec Spring Boot

JWT : Mise en oeuvre

☞ Ajouter la dépendance pour JWT

<dependency> <dependency>
<groupId>com.auth0</groupId> <groupId>[Link]</groupId>
<artifactId>java-jwt</artifactId> <artifactId>jjwt-api</artifactId>
<version>...</version> <version>...</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>

. [Link]
. [Link]
Ahmad Khoureich Ka (UADB) Spring Web Master SI 51 / 56
API REST avec Spring Boot

Créer un jeton JWT

public String creerJwt(String username,


List<String> roles,
long dureeValid,
String secret) {

Algorithm algo = Algorithm.HMAC256([Link]());


String jwt = JWT
.create()
.withSubject(username)
.withClaim("roles", roles)
.withExpiresAt([Link]().plusMillis(dureeValid))
.sign(algo);
return jwt;
}

Ahmad Khoureich Ka (UADB) Spring Web Master SI 52 / 56


API REST avec Spring Boot

Valider un jeton JWT

public DecodedJWT validaterJwt(String jwt, String secret) {


DecodedJWT decodedJWT = null;
try {
Algorithm algo = Algorithm.HMAC256([Link]());
JWTVerifier verifier = [Link](algo).build();
decodedJWT = [Link](jwt);
} catch (JWTVerificationException | IllegalArgumentException ex) {
[Link]("Jeton invalide: " + [Link]());
}

return decodedJWT;
}

☞ A partir de l’objet DecodedJWT plusieurs informations sur le jeton sont accessibles.

Ahmad Khoureich Ka (UADB) Spring Web Master SI 53 / 56


API REST avec Spring Boot

Jeton JWT : séquence d’authentification

☞ AuthenticationManager peut être obtenu à partir du bean


AuthenticationConfiguration.
Ahmad Khoureich Ka (UADB) Spring Web Master SI 54 / 56
API REST avec Spring Boot

Jeton JWT : séquence d’autorisation

☞ FiltreRequete est ajouté au SecurityFilterChain avant le filtre


AnonymousAuthenticationFilter.
Ahmad Khoureich Ka (UADB) Spring Web Master SI 55 / 56
API REST avec Spring Boot

Configurer Swagger pour JWT

@SecurityScheme(
name = "jwt",
scheme = "bearer",
type = [Link],
in = [Link]
)
@OpenAPIDefinition(
security = {
@SecurityRequirement(name = "jwt")
}
)
public class SwaggerConfig {}

. [Link]
Ahmad Khoureich Ka (UADB) Spring Web Master SI 56 / 56

Vous aimerez peut-être aussi