Autorización y autenticación en Java: conceptos básicos y herramientas
La autenticación y la autorización son dos pilares fundamentales de la seguridad de cualquier aplicación web. En el ecosistema de Java, existen numerosas bibliotecas y frameworks maduros para estas tareas. En este artículo, analizaremos en detalle las herramientas clave, sus características y proporcionaremos ejemplos prácticos de código.
1. Conceptos básicos
Antes de pasar a las herramientas, es importante diferenciar claramente los términos:
- Autenticación — verificación de la identidad del usuario (¿quién es usted?). Generalmente se realiza mediante usuario/contraseña, tokens o biometría.
- Autorización — verificación de los permisos de acceso (¿qué se le permite hacer?). Determina si un usuario puede realizar ciertas acciones.
2. Spring Security — el estándar de facto
Spring Security es el framework más popular para garantizar la seguridad en aplicaciones Java. Proporciona una solución integral tanto para autenticación como para autorización.
2.1. Configuración básica de autenticación
Para agregar Spring Security, añada la dependencia en pom.xml:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency>Configuración mínima con autenticación en memoria:
import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.security.config.annotation.web.builders.HttpSecurity;import org.springframework.security.core.userdetails.User;import org.springframework.security.core.userdetails.UserDetails;import org.springframework.security.provisioning.InMemoryUserDetailsManager;import org.springframework.security.web.SecurityFilterChain;
@Configurationpublic class SecurityConfig {
@Bean public InMemoryUserDetailsManager userDetailsManager() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("password") .roles("USER") .build(); return new InMemoryUserDetailsManager(user); }
@Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(authz -> authz .requestMatchers("/admin/**").hasRole("ADMIN") .requestMatchers("/user/**").hasRole("USER") .anyRequest().authenticated() ) .formLogin(login -> login.defaultSuccessUrl("/home")) .httpBasic(); return http.build(); }}3. JWT (JSON Web Tokens) para autenticación sin estado
JWT permite implementar autenticación sin almacenar estado en el servidor. El token contiene toda la información necesaria sobre el usuario y está firmado con una clave secreta.
3.1. Generación de JWT con la biblioteca jjwt
Añada la dependencia:
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.12.5</version></dependency>Ejemplo de creación y verificación de token:
import io.jsonwebtoken.Jwts;import io.jsonwebtoken.SignatureAlgorithm;import io.jsonwebtoken.security.Keys;import javax.crypto.SecretKey;import java.util.Date;
public class JwtUtil {
private static final SecretKey SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256); private static final long EXPIRATION_TIME = 3600000; // 1 hora
public static String generateToken(String username) { return Jwts.builder() .setSubject(username) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTi También en la biblioteca
Remeda para TypeScript: guía completa con ejemplos prácticos
Cliente OAuth para TypeScript: integración de autorización en aplicaciones web
ndarray en Rust: guía completa con ejemplos prácticos
Geolocalización y mapas en C++: revisión de bibliotecas y herramientas
Biblioteca estándar de Go (Golang): guía completa