Commit d7313e13 by Rubén Ramírez

feat: [UsuariosController]: Implementado el UsuariosController con el método de registro usuario

parent 84451dc5
......@@ -8,7 +8,7 @@ import org.springframework.boot.autoconfigure.domain.EntityScan;
"com.ujaen.tfg.mangaffinity.servicios",
"com.ujaen.tfg.mangaffinity.repositorios",
"com.ujaen.tfg.mangaffinity.rest",
// "com.ujaen.tfg.mangaffinity.seguridad"
"com.ujaen.tfg.mangaffinity.seguridad"
})
@EntityScan(basePackages="com.ujaen.tfg.mangaffinity")
public class MangAffinityApplication {
......
package com.ujaen.tfg.mangaffinity.rest;
import com.ujaen.tfg.mangaffinity.entidades.Usuario;
import com.ujaen.tfg.mangaffinity.excepciones.UsuarioYaRegistrado;
import com.ujaen.tfg.mangaffinity.rest.DTO.DTOUsuario;
import com.ujaen.tfg.mangaffinity.rest.DTO.Mapper;
import com.ujaen.tfg.mangaffinity.seguridad.JwtUtil;
import com.ujaen.tfg.mangaffinity.servicios.ServicioUsuarios;
import jakarta.validation.ConstraintViolationException;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/usuarios")
public class UsuariosController {
@Autowired
private ServicioUsuarios servicioUsuarios;
@Autowired
private Mapper mapper;
@ResponseStatus(HttpStatus.UNPROCESSABLE_ENTITY)
@ExceptionHandler(ConstraintViolationException.class)
public void mapeadoExcepcionConstraintViolationException() {}
@PostMapping("/")
public ResponseEntity<String> registrarUsuario(@RequestBody DTOUsuario dtoUsuario) {
try {
Usuario usuario = mapper.entity(dtoUsuario);
servicioUsuarios.crearUsuario(usuario);
return ResponseEntity.status(HttpStatus.CREATED).build();
} catch (UsuarioYaRegistrado e) {
return ResponseEntity.status(HttpStatus.CONFLICT).build();
}
}
}
package com.ujaen.tfg.mangaffinity.seguridad;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.Map;
import javax.crypto.SecretKey;
@Component
public class JwtUtil {
private final String SECRET_KEY = "clave_secreta"; // Cámbiala por algo más seguro
private static final SecretKey SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256);
private static final long EXPIRATION_TIME = 86400000; // 1 día en milisegundos
public String generarToken(String email) {
/**
* Genera un token JWT con los datos proporcionados.
*
* @param claims Información adicional a incluir en el token.
* @param subject Usuario o identificador asociado al token.
* @return Token JWT generado.
*/
public String generateToken(Map<String, Object> claims, String subject) {
return Jwts.builder()
.setSubject(email)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)) // 10 horas
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.setClaims(claims)
.setSubject(subject)
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.signWith(SECRET_KEY)
.compact();
}
public String extraerEmail(String token) {
return getClaims(token).getSubject();
/**
* Obtiene el usuario (subject) desde un token JWT.
*
* @param token Token JWT.
* @return Usuario extraído del token.
*/
public String extractUsername(String token) {
return extractClaim(token, Claims::getSubject);
}
/**
* Obtiene la fecha de expiración de un token JWT.
*
* @param token Token JWT.
* @return Fecha de expiración.
*/
public Date extractExpiration(String token) {
return extractClaim(token, Claims::getExpiration);
}
public boolean validarToken(String token, String email) {
return (email.equals(extraerEmail(token)) && !estaExpirado(token));
/**
* Extrae un claim específico del token.
*
* @param token Token JWT.
* @param claimsResolver Función que extrae el claim.
* @return Valor del claim extraído.
*/
public <T> T extractClaim(String token, java.util.function.Function<Claims, T> claimsResolver) {
final Claims claims = extractAllClaims(token);
return claimsResolver.apply(claims);
}
private boolean estaExpirado(String token) {
return getClaims(token).getExpiration().before(new Date());
/**
* Valida si un token es correcto y no ha expirado.
*
* @param token Token JWT.
* @param username Nombre de usuario a validar.
* @return `true` si el token es válido.
*/
public boolean validateToken(String token, String username) {
final String extractedUsername = extractUsername(token);
return (extractedUsername.equals(username) && !isTokenExpired(token));
}
private Claims getClaims(String token) {
return Jwts.parser()
private boolean isTokenExpired(String token) {
return extractExpiration(token).before(new Date());
}
private Claims extractAllClaims(String token) {
return Jwts.parserBuilder()
.setSigningKey(SECRET_KEY)
.build()
.parseClaimsJws(token)
.getBody();
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment