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