Communitygithub.com

Revisión de Seguridad Spring Boot

Mejores prácticas de Spring Security para autenticación/autorización, validación, CSRF, secretos, cabeceras, limitación de velocidad y seguridad de dependencias en servicios Java Spring Boot. Actívalo al revisar autenticación/autorización, validación, CSRF, secretos, cabeceras o limitación de velocidad en Spring Security.

¿Qué es Revisión de Seguridad Spring Boot?

Este skill proporciona una guía completa de mejores prácticas de seguridad para aplicaciones Spring Boot, cubriendo autenticación (JWT, OAuth2, basada en sesión), autorización con @PreAuthorize y roles, validación de entrada con Bean Validation, prevención de SQL Injection, codificación segura de contraseñas (BCrypt/Argon2), protección CSRF, gestión de secretos externalizados, cabeceras de seguridad, configuración CORS, limitación de velocidad con Bucket4j y escaneo de dependencias (OWASP/Snyk). Es útil para desarrolladores y revisores de código que trabajan con Spring Security, ya que proporciona ejemplos de código Java, configuraciones YAML y listas de verificación para garantizar una postura de seguridad defensiva. Se activa al añadir autenticación, implementar autorización, validar entrada del usuario, configurar CORS/CSRF/cabeceras de seguridad, gestionar secretos, agregar limitación de velocidad o escanear dependencias en busca de CVEs. Las plataformas compatibles incluyen Spring Boot, Spring Security, Spring Data, Bucket4j y herramientas de integración continua como Jenkins o GitHub Actions.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/ECC/tree/main/skills/springboot-security

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

¿Qué hace Revisión de Seguridad Spring Boot?

Úsalo al añadir autenticación, manejar entrada, crear endpoints o tratar con secretos.

Cuándo activarlo

  • Añadir autenticación (JWT, OAuth2, basada en sesión)
  • Implementar autorización (@PreAuthorize, acceso basado en roles)
  • Validar entrada de usuario (Bean Validation, validadores personalizados)
  • Configurar CORS, CSRF o cabeceras de seguridad
  • Gestionar secretos (Vault, variables de entorno)
  • Agregar limitación de velocidad o protección contra fuerza bruta
  • Escanear dependencias en busca de CVEs

Autenticación

  • Preferir JWT sin estado o tokens opacos con lista de revocación
  • Usar cookies httpOnly, Secure, SameSite=Strict para sesiones
  • Validar tokens con OncePerRequestFilter o resource server
@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);
  }
}

Autorización

  • Habilitar seguridad de métodos: @EnableMethodSecurity
  • Usar @PreAuthorize("hasRole('ADMIN')") o @PreAuthorize("@authz.canEdit(#id)")
  • Denegar por defecto; exponer solo los alcances necesarios
@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();
  }
}

Validación de entrada

  • Usar Bean Validation con @Valid en controladores
  • Aplicar restricciones en DTOs: @NotBlank, @Email, @Size, validadores personalizados
  • Sanitizar cualquier HTML con una lista blanca antes de renderizar
// MAL: Sin validación
@PostMapping("/users")
public User createUser(@RequestBody UserDto dto) {
  return userService.create(dto);
}

// BIEN: DTO validado
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));
}

Prevención de Inyección SQL

  • Usar repositorios de Spring Data o consultas parametrizadas
  • Para consultas nativas, usar enlaces :param; nunca concatenar cadenas
// MAL: Concatenación de cadenas en consulta nativa
@Query(value = "SELECT * FROM users WHERE name = '" + name + "'", nativeQuery = true)

// BIEN: Consulta nativa parametrizada
@Query(value = "SELECT * FROM users WHERE name = :name", nativeQuery = true)
List<User> findByName(@Param("name") String name);

// BIEN: Consulta derivada de Spring Data (auto-parametrizada)
List<User> findByEmailAndActiveTrue(String email);

Codificación de contraseñas

  • Siempre hashear contraseñas con BCrypt o Argon2 — nunca almacenar en texto plano
  • Usar el bean PasswordEncoder, no hasheo manual
@Bean
public PasswordEncoder passwordEncoder() {
  return new BCryptPasswordEncoder(12); // factor de costo 12
}

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

Protección CSRF

  • Para aplicaciones de sesión en navegador, mantener CSRF habilitado; incluir token en formularios/cabeceras
  • Para APIs puras con tokens Bearer, deshabilitar CSRF y confiar en autenticación sin estado
http
  .csrf(csrf -> csrf.disable())
  .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS));

Gestión de secretos

  • Sin secretos en el código fuente; cargar desde variables de entorno o vault
  • Mantener application.yml libre de credenciales; usar placeholders
  • Rotar tokens y credenciales de BD regularmente
# MAL: Hardcodeado en application.yml
spring:
  datasource:
    password: mySecretPassword123

# BIEN: Placeholder de variable de entorno
spring:
  datasource:
    password: ${DB_PASSWORD}

# BIEN: Integración con Spring Cloud Vault
spring:
  cloud:
    vault:
      uri: https://vault.example.com
      token: ${VAULT_TOKEN}

Cabeceras de seguridad

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)));

Configuración CORS

  • Configurar CORS a nivel del filtro de seguridad, no por controlador
  • Restringir orígenes permitidos — nunca usar * en producción
@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;
}

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

Limitación de velocidad

  • Aplicar Bucket4j o límites a nivel de gateway en endpoints costosos
  • Registrar y alertar sobre ráfagas; devolver 429 con sugerencias de reintento
// Usando Bucket4j para limitación de velocidad por 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\": \"Límite de velocidad excedido\"}");
    }
  }
}

Seguridad de dependencias

  • Ejecutar OWASP Dependency Check / Snyk en CI
  • Mantener Spring Boot y Spring Security en versiones compatibles
  • Fallar builds en CVEs conocidos

Registro y PII

  • Nunca registrar secretos, tokens, contraseñas o datos PAN completos
  • Enmascarar campos sensibles; usar registro JSON estructurado

Subida de archivos

  • Validar tamaño, tipo de contenido y extensión
  • Almacenar fuera de la raíz web; escanear si es necesario

Lista de verificación antes del lanzamiento

  • Tokens de autenticación validados y expirados correctamente
  • Guardias de autorización en cada ruta sensible
  • Todas las entradas validadas y sanitizadas
  • Sin SQL concatenado con cadenas
  • Postura CSRF correcta para el tipo de aplicación
  • Secretos externalizados; ninguno commitado
  • Cabeceras de seguridad configuradas
  • Limitación de velocidad en APIs
  • Dependencias escaneadas y actualizadas
  • Registros libres de datos sensibles

Recuerda: Denegar por defecto, validar entradas, mínimo privilegio y seguro por configuración primero.

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/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

affaan-m/ECC

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

affaan-m/fal-ai-media

Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.

affaan-m/manim-video

日本語翻訳:このファイルは manim-video 用の日本語翻訳が必要です

affaan-m/remotion-video-creation

Remotion のベストプラクティス - React で動画を作成する。3D、アニメーション、音声、字幕、チャート、トランジションなどをカバーするドメイン固有の29のルール。

affaan-m/video-editing

AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.

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.

agent-self-evaluation

Use after completing any non-trivial task. The agent self-rates its output on 5 axes — accuracy, completeness, clarity, actionability, conciseness — with concrete evidence per criterion. Produces a structured 1-5 scorecard with specific improvement suggestions.

agent-sort

Build an evidence-backed ECC install plan for a specific repo by sorting skills, commands, rules, hooks, and extras into DAILY vs LIBRARY buckets using parallel repo-aware review passes. Use when ECC should be trimmed to what a project actually needs instead of loading the full bundle.

ai-first-engineering

Engineering operating model for teams where AI agents generate a large share of implementation output. Use when setting team process, review gates, or ownership rules for a codebase largely written by agents.

ai-regression-testing

Regression testing strategies for AI-assisted development. Sandbox-mode API testing without database dependencies, automated bug-check workflows, and patterns to catch AI blind spots where the same model writes and reviews code. Use when adding regression coverage to AI-assisted code, or when the same model both wrote and reviewed a change.

android-clean-architecture

Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns. Use when structuring modules, layers, or data flow in an Android or KMP project.

angular-developer

Generates Angular code and provides architectural guidance. Trigger when creating projects, components, or services, or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling (component styles, Tailwind CSS), testing, or CLI tooling.

Skills relacionados