Seguridad
Configuración de Seguridad (SecurityConfig)
La clase SecurityConfig
es el núcleo de la seguridad de la aplicación. Vamos a analizar cada sección y cómo puedes adaptarla a tus necesidades.
Configuración Base
@Configuration
public class SecurityConfig {
private static final String HMAC_SHA_256 = "HmacSHA256";
private final String jwtSecret;
private final String frontendUrl;
}
HMAC_SHA_256
: Algoritmo para firmar tokens JWTjwtSecret
: Tu clave secreta (configurable en.env
)frontendUrl
: URL de tu frontend (configurable en.env
)
Endpoints Públicos y Protegidos
@Bean
public SecurityFilterChain securityFilterChain(final HttpSecurity http) throws Exception {
http.authorizeHttpRequests(auth -> auth
.requestMatchers(
"/v1/auth/**", // Endpoints de autenticación
"/error", // Página de error
"/actuator/**", // Endpoints de monitoreo
"/v3/api-docs/**", // Documentación OpenAPI
"/swagger-ui/**" // Interface Swagger
).permitAll()
.anyRequest().authenticated())
Personalización:
- Añade tus endpoints públicos a
.requestMatchers()
- Ejemplo para endpoints públicos adicionales:
.requestMatchers(
"/v1/auth/**",
"/api/public/**", // Tus endpoints públicos
"/api/products/**" // Ejemplo: productos visibles sin auth
).permitAll()
Configuración CORS
private CorsConfigurationSource corsConfigurationSource(final String origin) {
final var configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Collections.singletonList(origin));
configuration.setAllowedMethods(Collections.singletonList(CorsConfiguration.ALL));
configuration.setAllowedHeaders(Collections.singletonList(CorsConfiguration.ALL));
configuration.setAllowCredentials(true);
Personalización:
- Configura orígenes múltiples:
configuration.setAllowedOrigins(Arrays.asList(
"https://tuapp.com",
"https://staging.tuapp.com"
));
- Restringe métodos HTTP:
configuration.setAllowedMethods(Arrays.asList(
"GET", "POST", "PUT", "DELETE"
));
Configuración JWT
@Bean
public JwtDecoder jwtDecoder() {
return NimbusJwtDecoder
.withSecretKey(new SecretKeySpec(jwtSecret.getBytes(), HMAC_SHA_256))
.build();
}
Personalización:
- Cambia el algoritmo de firma:
private static final String ALGORITHM = "HmacSHA512"; // Más seguro
- Ajusta la configuración del decodificador:
@Bean
public JwtDecoder jwtDecoder() {
return NimbusJwtDecoder
.withSecretKey(new SecretKeySpec(jwtSecret.getBytes(), ALGORITHM))
.clock(Clock.systemDefaultZone()) // Personaliza la zona horaria
.build();
}
Encriptación de Contraseñas
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
Personalización:
- Ajusta la fuerza del hash:
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(12); // Mayor costo computacional
}
Protección CSRF
.csrf(csrf -> csrf.ignoringRequestMatchers("/v1/auth/**", "swagger-ui/**"));
Personalización:
- Excluir rutas adicionales:
.csrf(csrf -> csrf.ignoringRequestMatchers(
"/v1/auth/**",
"/api/webhooks/**", // Ejemplo: webhooks
"/api/public/**" // Endpoints públicos
));
Mejores Prácticas de Seguridad
-
JWT Secret:
- Usa una clave segura y larga (mínimo 256 bits)
- Rota la clave periódicamente
- Nunca compartas la clave
-
CORS:
- Lista blanca de orígenes específicos
- Evita usar
allowedOrigins("*")
- Configura solo los métodos necesarios
-
Endpoints:
- Principio de menor privilegio
- Documenta endpoints públicos
- Usa rate limiting en endpoints sensibles
-
Contraseñas:
- BCrypt con factor de trabajo 12+
- Valida fortaleza de contraseñas
- Implementa políticas de expiración
Nota: Estas son configuraciones base. Ajusta según tus requisitos de seguridad específicos.