Communitygithub.com

springboot-security

Bonnes pratiques Spring Security pour l'authentification/autorisation, la validation, la CSRF, les secrets, les en-têtes, la limitation de débit et la sécurité des dépendances dans les services Java Spring Boot.

Qu'est-ce que springboot-security ?

Ce skill est un guide complet de révision de sécurité pour les applications Spring Boot, destiné aux développeurs et aux réviseurs de code. Il couvre les bonnes pratiques d'authentification (JWT, OAuth2, sessions), d'autorisation (avec `@PreAuthorize` et `@EnableMethodSecurity`), de validation des entrées (Bean Validation), de protection CSRF, de gestion des secrets, de configuration CORS, des en-têtes de sécurité, de la limitation de débit (avec Bucket4j) et de la sécurité des dépendances. Le skill propose des extraits de code concrets montrant à la fois les mauvaises pratiques (comme la concaténation de chaînes SQL ou les mots de passe en clair) et les bonnes pratiques à adopter. Il inclut également une checklist avant mise en production pour s'assurer que toutes les mesures de sécurité essentielles sont en place. Ce skill est utilisable avec Claude Code et d'autres agents IA pour auditer ou améliorer la sécurité des services Java Spring Boot. Il est conçu pour être activé lors de l'ajout d'authentification, de la gestion des entrées, de la création d'endpoints, ou du traitement des secrets. En suivant les recommandations, les développeurs peuvent adopter une approche 'deny by default', valider les entrées, appliquer le moindre privilège, et configurer la sécurité par défaut.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/everything-claude-code/tree/main/skills/springboot-security

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Révision de la Sécurité Spring Boot

À utiliser lors de l'ajout d'authentification, de la gestion des entrées, de la création d'endpoints ou du traitement des secrets.

Quand Activer

  • Ajout d'authentification (JWT, OAuth2, basée sur session)
  • Implémentation d'autorisation (@PreAuthorize, contrôle d'accès basé sur les rôles)
  • Validation des entrées utilisateur (Bean Validation, validateurs personnalisés)
  • Configuration de CORS, CSRF ou des en-têtes de sécurité
  • Gestion des secrets (Vault, variables d'environnement)
  • Ajout de limitation de débit ou de protection contre les attaques par force brute
  • Analyse des dépendances pour les CVEs

Authentification

  • Privilégier les jetons JWT sans état ou opaques avec liste de révocation
  • Utiliser des cookies httpOnly, Secure, SameSite=Strict pour les sessions
  • Valider les jetons avec OncePerRequestFilter ou un serveur de ressources
@Component
public class JwtAuthFilter extends OncePerRequestFilter {
  private final JwtService jwtService;

  public JwtAuthFilter(JwtService jwtService) {
    this.jwtService = jwtService;
  }

  @Override
  protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
      FilterChain chain) throws ServletException, IOException {
    String header = request.getHeader(HttpHeaders.AUTHORIZATION);
    if (header != null && header.startsWith("Bearer ")) {
      String token = header.substring(7);
      Authentication auth = jwtService.authenticate(token);
      SecurityContextHolder.getContext().setAuthentication(auth);
    }
    chain.doFilter(request, response);
  }
}

Autorisation

  • Activer la sécurité par méthode : @EnableMethodSecurity
  • Utiliser @PreAuthorize("hasRole('ADMIN')") ou @PreAuthorize("@authz.canEdit(#id)")
  • Refuser par défaut ; n'exposer que les portées nécessaires
@RestController
@RequestMapping("/api/admin")
public class AdminController {

  @PreAuthorize("hasRole('ADMIN')")
  @GetMapping("/users")
  public List<UserDto> listUsers() {
    return userService.findAll();
  }

  @PreAuthorize("@authz.isOwner(#id, authentication)")
  @DeleteMapping("/users/{id}")
  public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
    userService.delete(id);
    return ResponseEntity.noContent().build();
  }
}

Validation des Entrées

  • Utiliser Bean Validation avec @Valid sur les contrôleurs
  • Appliquer des contraintes sur les DTOs : @NotBlank, @Email, @Size, validateurs personnalisés
  • Nettoyer tout HTML avec une liste blanche avant affichage
// MAUVAIS : Pas de validation
@PostMapping("/users")
public User createUser(@RequestBody UserDto dto) {
  return userService.create(dto);
}

// BON : DTO validé
public record CreateUserDto(
    @NotBlank @Size(max = 100) String name,
    @NotBlank @Email String email,
    @NotNull @Min(0) @Max(150) Integer age
) {}

@PostMapping("/users")
public ResponseEntity<UserDto> createUser(@Valid @RequestBody CreateUserDto dto) {
  return ResponseEntity.status(HttpStatus.CREATED)
      .body(userService.create(dto));
}

Prévention des Injections SQL

  • Utiliser les dépôts Spring Data ou des requêtes paramétrées
  • Pour les requêtes natives, utiliser les liaisons :param ; ne jamais concaténer des chaînes
// MAUVAIS : Concaténation de chaînes dans une requête native
@Query(value = "SELECT * FROM users WHERE name = '" + name + "'", nativeQuery = true)

// BON : Requête native paramétrée
@Query(value = "SELECT * FROM users WHERE name = :name", nativeQuery = true)
List<User> findByName(@Param("name") String name);

// BON : Requête dérivée Spring Data (auto-paramétrée)
List<User> findByEmailAndActiveTrue(String email);

Encodage des Mots de Passe

  • Toujours hacher les mots de passe avec BCrypt ou Argon2 — ne jamais stocker en clair
  • Utiliser un bean PasswordEncoder, pas de hachage manuel
@Bean
public PasswordEncoder passwordEncoder() {
  return new BCryptPasswordEncoder(12); // facteur de coût 12
}

// Dans le service
public User register(CreateUserDto dto) {
  String hashedPassword = passwordEncoder.encode(dto.password());
  return userRepository.save(new User(dto.email(), hashedPassword));
}

Protection CSRF

  • Pour les applications avec session navigateur, garder CSRF activé ; inclure le jeton dans les formulaires/en-têtes
  • Pour les API pures avec jetons Bearer, désactiver CSRF et s'appuyer sur une authentification sans état
http
  .csrf(csrf -> csrf.disable())
  .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS));

Gestion des Secrets

  • Aucun secret dans le code source ; charger depuis l'environnement ou un coffre
  • Garder application.yml exempt d'identifiants ; utiliser des espaces réservés
  • Renouveler régulièrement les jetons et les identifiants de base de données
# MAUVAIS : Codé en dur dans application.yml
spring:
  datasource:
    password: mySecretPassword123

# BON : Espace réservé pour variable d'environnement
spring:
  datasource:
    password: ${DB_PASSWORD}

# BON : Intégration Spring Cloud Vault
spring:
  cloud:
    vault:
      uri: https://vault.example.com
      token: ${VAULT_TOKEN}

En-têtes de Sécurité

http
  .headers(headers -> headers
    .contentSecurityPolicy(csp -> csp
      .policyDirectives("default-src 'self'"))
    .frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin)
    .xssProtection(Customizer.withDefaults())
    .referrerPolicy(rp -> rp.policy(ReferrerPolicyHeaderWriter.ReferrerPolicy.NO_REFERRER)));

Configuration CORS

  • Configurer CORS au niveau du filtre de sécurité, pas par contrôleur
  • Restreindre les origines autorisées — ne jamais utiliser * en production
@Bean
public CorsConfigurationSource corsConfigurationSource() {
  CorsConfiguration config = new CorsConfiguration();
  config.setAllowedOrigins(List.of("https://app.example.com"));
  config.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE"));
  config.setAllowedHeaders(List.of("Authorization", "Content-Type"));
  config.setAllowCredentials(true);
  config.setMaxAge(3600L);

  UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
  source.registerCorsConfiguration("/api/**", config);
  return source;
}

// Dans SecurityFilterChain :
http.cors(cors -> cors.configurationSource(corsConfigurationSource()));

Limitation de Débit

  • Appliquer Bucket4j ou des limites au niveau de la passerelle sur les endpoints coûteux
  • Journaliser et alerter en cas de pics ; retourner 429 avec des indications de nouvelle tentative
// Utilisation de Bucket4j pour la limitation de débit par endpoint
@Component
public class RateLimitFilter extends OncePerRequestFilter {
  private final Map<String, Bucket> buckets = new ConcurrentHashMap<>();

  private Bucket createBucket() {
    return Bucket.builder()
        .addLimit(Bandwidth.classic(100, Refill.intervally(100, Duration.ofMinutes(1))))
        .build();
  }

  @Override
  protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
      FilterChain chain) throws ServletException, IOException {
    String clientIp = request.getRemoteAddr();
    Bucket bucket = buckets.computeIfAbsent(clientIp, k -> createBucket());

    if (bucket.tryConsume(1)) {
      chain.doFilter(request, response);
    } else {
      response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value());
      response.getWriter().write("{\"error\": \"Rate limit exceeded\"}");
    }
  }
}

Sécurité des Dépendances

  • Exécuter OWASP Dependency Check / Snyk dans l'intégration continue
  • Maintenir Spring Boot et Spring Security sur des versions supportées
  • Échouer les builds en cas de CVEs connues

Journalisation et Données Personnelles (PII)

  • Ne jamais journaliser les secrets, jetons, mots de passe ou données PAN complètes
  • Masquer les champs sensibles ; utiliser une journalisation structurée en JSON

Téléchargements de Fichiers

  • Valider la taille, le type de contenu et l'extension
  • Stocker en dehors de la racine web ; scanner si nécessaire

Checklist Avant la Mise en Production

  • Les jetons d'authentification sont validés et expirent correctement
  • Des gardes d'autorisation sont présentes sur chaque chemin sensible
  • Toutes les entrées sont validées et nettoyées
  • Pas de SQL concaténé avec des chaînes
  • La posture CSRF est correcte pour le type d'application
  • Les secrets sont externalisés ; aucun n'est commité
  • Les en-têtes de sécurité sont configurés
  • La limitation de débit est active sur les API
  • Les dépendances sont analysées et à jour
  • Les journaux sont exempts de données sensibles

Rappel : Refuser par défaut, valider les entrées, moindre privilège, et sécurité par configuration en premier.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/claude-api

Anthropic Claude API patterns for Python and TypeScript. Covers Messages API, streaming, tool use, vision, extended thinking, batches, prompt caching, and Claude Agent SDK. Use when building applications with the Claude API or Anthropic SDKs.

affaan-m/everything-claude-code

End-to-end marketing campaign planning and execution. Covers audience research, positioning, campaign angle definition, landing page copy, email sequences, social posts, ad copy, short-form video scripts, and content calendars. Use as the orchestration layer for multi-channel product launches. Use when planning or executing a multi-channel product launch, or producing landing page, email, social, or ad copy.

affaan-m/everything-claude-code

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/everything-claude-code-conventions

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/frontend-design

Create distinctive, production-grade frontend interfaces with high design quality. Use when the user asks to build web components, pages, or applications and the visual direction matters as much as the code quality.

affaan-m/gget

gget CLI and Python workflow for quick genomic database queries, sequence lookup, BLAST-style searches, enrichment checks, and reproducible bioinformatics evidence logs.

affaan-m/literature-review

Systematic literature-review workflow for academic, biomedical, technical, and scientific topics, including search planning, source screening, synthesis, citation checks, and evidence logging.

affaan-m/motion-ui

Production-ready UI motion system for React/Next.js. Use when implementing animations, transitions, or motion patterns.

affaan-m/project-guidelines-example

Example project-specific skill template based on a real production application.

affaan-m/pubmed-database

Direct PubMed and NCBI E-utilities search workflows for biomedical literature, MeSH queries, PMID lookup, citation retrieval, and API-backed literature monitoring.

affaan-m/scholar-evaluation

Structured scholarly-work evaluation for papers, proposals, literature reviews, methods sections, evidence quality, citation support, and research-writing feedback.

affaan-m/uspto-database

USPTO patent and trademark data workflow for official record lookup, PatentSearch queries, TSDR checks, assignment data, and reproducible IP research logs.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

Skills associés