Aller au contenu principal

Chapitre 4: Cours Complémentaire

🎯 Objectifs​

  • Approfondir les concepts avec les cours complémentaires
  • Explorer les modules 22 à 28 sur la sécurité
  • Maîtriser les aspects avancés du projet

📚 Ressource Principale​

Cours Complémentaire

Tous les cours complémentaires sont disponibles dans le repository:

📖 Dossier Cours

Focus particulier sur les modules 22 à 28 pour la partie sécurité.


🗂️ Structure des Cours​

Le dossier cours/ contient une série de modules progressifs:

Vue d'ensemble​

ModuleSujetDescription
01-10FondamentauxBases du projet, setup, architecture
11-18Security DétailléeSpring Security pas à pas (voir Chapitre 5)
19-21API AvancéeEndpoints complexes, validation
22-28Security AvancéeJWT, rôles, protection des routes

🔐 Focus: Modules 22 à 28 (Security)​

Ces modules couvrent les aspects avancés de la sécurité:

Module 22: Introduction à Spring Security​

  • Configuration de base
  • Filtres de sécurité
  • AuthenticationManager

Module 23: Authentification par Formulaire​

  • UserDetailsService
  • PasswordEncoder
  • Stockage des utilisateurs

Module 24: JWT (JSON Web Tokens)​

  • Génération de tokens
  • Validation de tokens
  • Structure d'un JWT
// Structure d'un JWT
{
"header": {
"alg": "HS256",
"typ": "JWT"
},
"payload": {
"sub": "user@example.com",
"iat": 1609459200,
"exp": 1609545600,
"roles": ["USER", "ADMIN"]
},
"signature": "..."
}

Module 25: Filtres d'Authentification​

  • JwtAuthenticationFilter
  • Chaîne de filtres Spring Security
  • OncePerRequestFilter
@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {

@Override
protected void doFilterInternal(
HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {

String authHeader = request.getHeader("Authorization");

if (authHeader != null && authHeader.startsWith("Bearer ")) {
String token = authHeader.substring(7);
// Valider le token et authentifier
}

filterChain.doFilter(request, response);
}
}

Module 26: Autorisation basée sur les Rôles​

  • @PreAuthorize
  • @Secured
  • hasRole() et hasAuthority()
@RestController
@RequestMapping("/api/admin")
public class AdminController {

@GetMapping("/leads")
@PreAuthorize("hasRole('ADMIN')")
public List<LeadDto> getAllLeads() {
return leadService.getAllLeads();
}

@DeleteMapping("/leads/{id}")
@PreAuthorize("hasRole('ADMIN')")
public void deleteLead(@PathVariable Long id) {
leadService.deleteLead(id);
}
}

Module 27: Protection des Routes​

  • Configuration SecurityFilterChain
  • Endpoints publics vs protégés
  • CORS et CSRF
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.csrf(csrf -> csrf.disable())
.cors(cors -> cors.configurationSource(corsConfigurationSource()))
.authorizeHttpRequests(auth -> auth
// Endpoints publics
.requestMatchers("/api/contact").permitAll()
.requestMatchers("/api/auth/**").permitAll()
// Endpoints protégés
.requestMatchers("/api/admin/**").hasRole("ADMIN")
// Tout le reste nécessite authentification
.anyRequest().authenticated()
)
.sessionManagement(session ->
session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
)
.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class)
.build();
}

Module 28: Tests de Sécurité​

  • @WithMockUser
  • Tests d'autorisation
  • Tests d'authentification
@SpringBootTest
@AutoConfigureMockMvc
class SecurityTests {

@Autowired
private MockMvc mockMvc;

@Test
void adminEndpoint_withoutAuth_returns401() throws Exception {
mockMvc.perform(get("/api/admin/leads"))
.andExpect(status().isUnauthorized());
}

@Test
@WithMockUser(roles = "ADMIN")
void adminEndpoint_withAdmin_returns200() throws Exception {
mockMvc.perform(get("/api/admin/leads"))
.andExpect(status().isOk());
}

@Test
void publicEndpoint_withoutAuth_returns200() throws Exception {
mockMvc.perform(post("/api/contact")
.contentType(MediaType.APPLICATION_JSON)
.content("{...}"))
.andExpect(status().isOk());
}
}

📋 Concepts Clés Abordés​

Architecture de Sécurité​

┌─────────────────────────────────────────────────────────┐
│ Requête HTTP │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ Security Filter Chain │
│ ┌───────────────────────────────────────────────────┐ │
│ │ 1. CorsFilter │ │
│ │ 2. CsrfFilter (désactivé pour API) │ │
│ │ 3. JwtAuthenticationFilter ◄─── Valide le token │ │
│ │ 4. UsernamePasswordAuthenticationFilter │ │
│ │ 5. AuthorizationFilter ◄─── Vérifie les rôles │ │
│ └───────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ Controller │
└─────────────────────────────────────────────────────────┘

Flux d'Authentification JWT​


🛠️ Exercices Pratiques​

Exercice 1: Ajouter un nouveau rôle​

Ajouter un rôle MANAGER qui peut voir les leads mais pas les supprimer.

Exercice 2: Token avec expiration personnalisée​

Modifier la durée de validité du token JWT (ex: 1 heure au lieu de 24).

Exercice 3: Endpoint avec plusieurs rôles​

Créer un endpoint accessible par ADMIN ET MANAGER.

@PreAuthorize("hasAnyRole('ADMIN', 'MANAGER')")
public List<LeadDto> getLeadsForManagers() {
// ...
}

📖 Accéder aux Cours​

Lien Direct

📚 Accéder au dossier cours complet

Consultez les modules 22 à 28 pour une compréhension approfondie de la sécurité Spring Boot.


⏭️ Prochaine Étape​

Le chapitre suivant couvre la sécurité de manière encore plus détaillée avec les modules 11 à 18 des annexes:

Chapitre 5: Security Avancée (Modules 11-18) →


Retour à l'index du module