Autorización y autenticación en Java: Spring Security y JWT
Organizar el acceso seguro a los recursos es una de las tareas clave al desarrollar aplicaciones web en Java. En este artículo, analizaremos dos conceptos fundamentales: autenticación (verificación de la identidad del usuario) y autorización (verificación de los permisos de acceso). Consideraremos ejemplos prácticos utilizando el popular framework Spring Security y la tecnología JSON Web Tokens (JWT).
1. Conceptos básicos
Antes de pasar al código, es importante diferenciar claramente los términos:
- Autenticación (Authentication) — el proceso de verificar quién es el usuario. Generalmente se realiza mediante inicio de sesión y contraseña, biometría o tokens.
- Autorización (Authorization) — el proceso de determinar qué se le permite hacer al usuario. Por ejemplo, acceso a ciertos endpoints de la API o funciones de la aplicación.
En las aplicaciones Java modernas, para implementar estos mecanismos se utiliza con mayor frecuencia la combinación Spring Security + JWT. JWT permite almacenar información sobre el usuario en un token compacto que se puede transferir fácilmente entre el cliente y el servidor.
2. Configuración de Spring Security con JWT
Agreguemos las dependencias necesarias en pom.xml (Maven):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.12.3</version></dependency><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.12.3</version> <scope>runtime</scope></dependency><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>0.12.3</version> <scope>runtime</scope></dependency>3. Creación del servicio para trabajar con JWT
Creemos la clase JwtService, que se encargará de la generación y verificación de tokens:
import io.jsonwebtoken.Claims;import io.jsonwebtoken.Jwts;import io.jsonwebtoken.SignatureAlgorithm;import io.jsonwebtoken.security.Keys;import org.springframework.stereotype.Service;
import javax.crypto.SecretKey;import java.util.Date;import java.util.HashMap;import java.util.Map;
@Servicepublic class JwtService {
private final SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256); private final long expirationMs = 86400000; // 24 horas
public String generateToken(String username) { Map<String, Object> claims = new HashMap<>(); return Jwts.builder() .setClaims(claims) .setSubject(username) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + expirationMs)) .signWith(secretKey) .compact(); }
public String extractUsername(String token) { return extractAllClaims(token).getSubject(); }
private Claims extractAllClaims(String token) { return Jwts.parserBuilder() .setSigningKey(secretKey) .build() .parseClaimsJws(token) .getBody(); }
public boolean isTokenValid(String token, String username) { final String extractedUsername = extractUsername(token); return (extractedUsername.equals(username) && !isTokenExpired(token)); }
private boolean isTokenExpired(String token) { return extractAllClaims(token).getExpiration().befo También en la biblioteca
Geolocalización y mapas en Go (Golang): bibliotecas y ejemplos de código
Envío de SMS en C++ con la API de la biblioteca libcurl
Cliente HTTP para C# (.NET): mejores bibliotecas para trabajar con solicitudes web
Planificador de tareas Kotlin: kotlinx-coroutines-core y la biblioteca korGE