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; ...@@ -8,7 +8,7 @@ import org.springframework.boot.autoconfigure.domain.EntityScan;
"com.ujaen.tfg.mangaffinity.servicios", "com.ujaen.tfg.mangaffinity.servicios",
"com.ujaen.tfg.mangaffinity.repositorios", "com.ujaen.tfg.mangaffinity.repositorios",
"com.ujaen.tfg.mangaffinity.rest", "com.ujaen.tfg.mangaffinity.rest",
// "com.ujaen.tfg.mangaffinity.seguridad" "com.ujaen.tfg.mangaffinity.seguridad"
}) })
@EntityScan(basePackages="com.ujaen.tfg.mangaffinity") @EntityScan(basePackages="com.ujaen.tfg.mangaffinity")
public class MangAffinityApplication { 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; package com.ujaen.tfg.mangaffinity.seguridad;
import io.jsonwebtoken.Claims; import io.jsonwebtoken.*;
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.security.Keys;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Date; import java.util.Date;
import java.util.Map;
import javax.crypto.SecretKey;
@Component @Component
public class JwtUtil { 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() return Jwts.builder()
.setSubject(email) .setClaims(claims)
.setIssuedAt(new Date()) .setSubject(subject)
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)) // 10 horas .setIssuedAt(new Date(System.currentTimeMillis()))
.signWith(SignatureAlgorithm.HS256, SECRET_KEY) .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.signWith(SECRET_KEY)
.compact(); .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) { private boolean isTokenExpired(String token) {
return Jwts.parser() return extractExpiration(token).before(new Date());
}
private Claims extractAllClaims(String token) {
return Jwts.parserBuilder()
.setSigningKey(SECRET_KEY) .setSigningKey(SECRET_KEY)
.build()
.parseClaimsJws(token) .parseClaimsJws(token)
.getBody(); .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